黑马程序员技术交流社区
标题:
多线程的一点疑问
[打印本页]
作者:
七里香
时间:
2013-9-16 18:26
标题:
多线程的一点疑问
本帖最后由 七里香 于 2013-9-22 11:41 编辑
看过了多线程视频,知道了线程的作用和使用方法,线程能执行由参数的方法,那么如果委托方法有返回参数那又该如何实现呢?求各位老鸟解答一下啊。还有如果委托是带有输出参数的方法,那么线程又如何接收委托的输出参数呢?
作者:
haxyek
时间:
2013-9-16 23:47
我觉得啊,线程 委托别人做事,做完就好,做的过程,结果,我不需要知道。。
不知道这么理解对不对。。
望指教。。
作者:
念念念念_、
时间:
2013-9-17 00:23
delegate int CompareDelegate(object value1,object value2);//如果values1比value2大则返回>0的数,如果values1比value2小则返回<0的数,如果相等则返回0
static object GetMax(object[] values,CompareDelegate comparor)
{
object max = values[0];
foreach (object obj in values)
{
if (comparor(obj, max) > 0)
{
max = obj;
}
}
return max;
}
复制代码
这个是关于委托带参数的案例
作者:
念念念念_、
时间:
2013-9-17 00:29
using System;
using System.Threading;
//ThreadWithState 类里包含了将要执行的任务以及执行任务的方法
public class ThreadWithState {
//要用到的属性,也就是我们要传递的参数
private string boilerplate;
private int value;
//包含参数的构造函数
public ThreadWithState(string text, int number)
{
boilerplate = text;
value = number;
}
//要丢给线程执行的方法,本处无返回类型就是为了能让ThreadStart来调用
public void ThreadProc()
{
//这里就是要执行的任务,本处只显示一下传入的参数
Console.WriteLine(boilerplate, value);
}
}
//用来调用上面方法的类,是本例执行的入口
public class Example {
public static void Main()
{
//实例化ThreadWithState类,为线程提供参数
ThreadWithState tws = new ThreadWithState(
"This report displays the number {0}.", 42);
// 创建执行任务的线程,并执行
Thread t = new Thread(new ThreadStart(tws.ThreadProc));
t.Start();
Console.WriteLine("Main thread does some work, then waits.");
t.Join();
Console.WriteLine(
"Independent task has completed; main thread ends.");
}
}
复制代码
这个是找到的资源,你可以看下,希望对你有帮助!
作者:
韩继新
时间:
2013-9-20 19:15
你是问如果一个方法有参数怎么用线程调用是吗?
XmlDocument doc = new XmlDocument();
//传一个无参的方法
Thread th = new Thread(new ThreadStart(DownloadData));
th.IsBackground = true;
th.Start();
//利用方法的重载将将有参数的方法放到它的重载方法中,然后交给线程调用
private void DownloadData()
{
DownloadData(doc);
}
private void DownloadData(XmlDocument doc)
{
WebClient myWebClient = new WebClient();
foreach (XmlNode item in doc.SelectNodes("/tables"))
{
foreach (XmlNode node in item)
{
foreach (XmlNode node_Child in node)
{
#region 从表中得到字段的值,根据值下载
if (node.Name == "GXS_PATIENT_INFO" && node_Child.Name == "SELECTSQL")
{
table = esql.ExecuteSelectSQLStr(string.Format(node_Child.InnerText, Model.gXSID));
for (int i = 0; i < table.Rows.Count; i++)
{
if (table.Rows
["PHOTO"] != null)
{
fileName = table.Rows
["PHOTO"].ToString();
if (RemoteFileExists(webPath + fileName))
{
tem_Dfile = fileName;
tem_Dfile = tem_Dfile.Substring(tem_Dfile.LastIndexOf("/") + 1, tem_Dfile.Length - tem_Dfile.LastIndexOf("/") - 1);
if (Directory.Exists(driveName + "
\\gxs\\com.zunran.gxs\\Images
") == false)//如果不存在就创建file文件夹
{
Directory.CreateDirectory(driveName + "
\\gxs\\com.zunran.gxs\\Images
");
}
fileNameTo = driveName + "
\\gxs\\com.zunran.gxs\\Images\\
" + tem_Dfile;
DownImage(webPath + fileName, fileNameTo);
}
}
}
}
#endregion
//查询数据
if (node_Child.Name == "SELECTSQL")
{
table = esql.ExecuteSelectSQLStr(string.Format(node_Child.InnerText, Model.gXSID));
}
if (node_Child.Name == "INSERTSQL")
{
if (table.Rows.Count > 0)
{
//循环列将列名用,拼接起来在插入数据的时候用
for (int i = 0; i < table.Columns.Count; i++)
{
if (i < table.Columns.Count - 1)
{
columnNames += table.Columns
.ColumnName + ",";
}
else if (i == table.Columns.Count - 1)
{
columnNames += table.Columns
.ColumnName;
}
}
//遍历每一行数据
try
{
for (int i = 0; i < table.Rows.Count; i++)
{
//将每一行数据的值用,连接起来
for (int j = 0; j < table.Columns.Count; j++)
{
if (j < table.Columns.Count - 1)
{
columnValues += "'" + table.Rows
[j] + "'" + ",";
}
else if (j == table.Columns.Count - 1)
{
columnValues += "'" + table.Rows
[j] + "'";
}
}
cmd.CommandText = string.Format(node_Child.InnerText, columnNames, columnValues);
SQLiteHelper.ExecuteNonQuery(cmd);
//每插入一条数据就清空一下值
columnValues = "";
}
SQLiteHelper.trans.Commit();
}
catch (Exception e)
{
SQLiteHelper.trans.Rollback();
throw new Exception(e.Message);
}
finally
{
SQLiteHelper.trans = null;
}
//每插入完成一张表清空一下列名
columnNames = "";
}
tableCount += 1;
tableName += node.Name + "\r\n";
//txtNotice.Text = "下载好了" + tableCount.ToString() + "张表中数据";
//解决跨线程给控件赋值的问题
Control.CheckForIllegalCrossThreadCalls = false;
txtNotice.Text = "下载好了下面表\r\n" + tableName + "\r\n共【" + tableCount + "】张表";
}
}
}
}
SQLiteHelper.con.Close();
}
作者:
七里香
时间:
2013-9-20 20:05
w我要的是有out或者pre参数的方法该怎么处理啊!或者方法有返回值,不是void哦那样该怎么办呢?不过还是谢谢了,你的回复让我学习了数据流写入doc文件的方法{:soso_e100:}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2