黑马程序员技术交流社区

标题: 多线程的一点疑问 [打印本页]

作者: 七里香    时间: 2013-9-16 18:26
标题: 多线程的一点疑问
本帖最后由 七里香 于 2013-9-22 11:41 编辑

看过了多线程视频,知道了线程的作用和使用方法,线程能执行由参数的方法,那么如果委托方法有返回参数那又该如何实现呢?求各位老鸟解答一下啊。还有如果委托是带有输出参数的方法,那么线程又如何接收委托的输出参数呢?

作者: haxyek    时间: 2013-9-16 23:47
我觉得啊,线程 委托别人做事,做完就好,做的过程,结果,我不需要知道。。
不知道这么理解对不对。。
望指教。。
作者: 念念念念_、    时间: 2013-9-17 00:23
  1. delegate int CompareDelegate(object value1,object value2);//如果values1比value2大则返回>0的数,如果values1比value2小则返回<0的数,如果相等则返回0
  2. static object GetMax(object[] values,CompareDelegate comparor)
  3. {
  4. object max = values[0];
  5. foreach (object obj in values)
  6. {
  7. if (comparor(obj, max) > 0)
  8. {
  9. max = obj;
  10. }
  11. }
  12. return max;
  13. }
复制代码
这个是关于委托带参数的案例
作者: 念念念念_、    时间: 2013-9-17 00:29
  1. using System;
  2. using System.Threading;
  3. //ThreadWithState 类里包含了将要执行的任务以及执行任务的方法
  4. public class ThreadWithState {
  5. //要用到的属性,也就是我们要传递的参数
  6. private string boilerplate;
  7. private int value;
  8. //包含参数的构造函数
  9. public ThreadWithState(string text, int number)
  10. {
  11. boilerplate = text;
  12. value = number;
  13. }
  14. //要丢给线程执行的方法,本处无返回类型就是为了能让ThreadStart来调用
  15. public void ThreadProc()
  16. {
  17. //这里就是要执行的任务,本处只显示一下传入的参数
  18. Console.WriteLine(boilerplate, value);
  19. }
  20. }
  21. //用来调用上面方法的类,是本例执行的入口
  22. public class Example {
  23. public static void Main()
  24. {
  25. //实例化ThreadWithState类,为线程提供参数
  26. ThreadWithState tws = new ThreadWithState(
  27. "This report displays the number {0}.", 42);
  28. // 创建执行任务的线程,并执行
  29. Thread t = new Thread(new ThreadStart(tws.ThreadProc));
  30. t.Start();
  31. Console.WriteLine("Main thread does some work, then waits.");
  32. t.Join();
  33. Console.WriteLine(
  34. "Independent task has completed; main thread ends.");
  35. }
  36. }

复制代码
这个是找到的资源,你可以看下,希望对你有帮助!

作者: 韩继新    时间: 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