C# 多线程

产生一个线程的4步骤

–编写产生线程所要执行的方法
–引用System.Threading命名空间
–实例化Thread类,并传入一个指向线程所要运行方法的委托。(这时候这个线程已经产生,但是还没有运行)
–调用Thread实例的Start方法,标记该线程可以被CPU执行了,但具体执行时间由CPU决定
 
线程的结束
Thread.Abort() 强制终止线程 或者 委托调用的方法体执行结束线程也会自动退出
 
其它线程中给窗体主线程赋值
 
TextBox.CheckForIllegalCrossThreadCalls = false; 把该属性设成false,可以在其它线程中使用textbox实例(不推荐使用)
 
new 出来的线程默认是前台线程,所以窗体关闭,线程如果没有结束还会在继续运行,
所以或者在关闭窗口时调用abort方法, 或者在new thread时指定其为后台线程 th.IsBackground = true;
 
如果直接从其它线程中给窗体线程中的对象赋值,会引发异常:不能从不是创建该控件的线程调用它
 
Control.Invoke 在拥有此控件的基础窗口句柄的线程上执行指定的委托。
Invoke方法会顺着控件树向上搜索,直到找到创建控件的那个线程(通常是主线程),然后进入那个线程改变控件的外观,确保不发生线程冲突。对不同的控件写法不同。对于TextBox,要TextBoxObject.Invoke,对于Label,又要LabelObject.Invoke。有没有统一一点的写法呢?主窗口类本身也有Invoke方法。如果你不想对不同的控件写法不一样,可以全部用this.Invoke:
Invoke
 1 public partial class Form1 : Form
 2     {
 3         delegate void SetTextBoxTextDelegate(string text);
 4         SetTextBoxTextDelegate setTextDel;
 5         public Form1()
 6         {
 7             InitializeComponent();
 8             //TextBox.CheckForIllegalCrossThreadCalls = false;
 9             setTextDel = new SetTextBoxTextDelegate(this.SetText);
10         }
11 
12         private void button1_Click(object sender, EventArgs e)
13         {
14             Thread th = new Thread(new ThreadStart(this.process));
15             th.IsBackground = true;
16             th.Start();
17         }
18 
19         private void process()
20         {
21             DateTime start = DateTime.Now;
22             for (int i = 0; i < 99999; i++)
23             {
24      
25                 //{textBox1.Text = i.ToString();}
26                 this.Invoke(setTextDel, i.ToString());
27             }
28             DateTime end = DateTime.Now;
29             TimeSpan span = end - start;
30             MessageBox.Show("task finished " + span.Seconds);
31         }
32 
33         private void SetText(string text)
34         {
35             textBox1.Text = text;
36         }
37     }

可以使用 MessageBox.Show(Thread.CurrentThread.ManagedThreadId.ToString()); 观察 invoke 调用的方法执行时所在的线程 以及 当前线程,可知他们并非同一线程.

 
posted @ 2013-02-18 18:42  Gravin  阅读(244)  评论(0编辑  收藏  举报