C# 委托及线程
一、简述
简单记录一下C#涉及的委托及线程知识点,以便随时可查询。
二、内容
C#的线程有以下6种方法实现:
1、Thread 线程类;
2、Delegates 委托;
3、Backgroud Worker;
4、ThreadPool 线程池;
5、Task 任务类;
6、Parallel 并行类。
以上的方法使用时建议使用Lambda 表达式,因其delegate参数类型多变,不好掌控。
C#的委托调用有以下2种方法:
1、BeinInvoke => 异步调用,EndInvoke => 获得异步调用的返回值(方法没执行完毕之前会一直阻塞);
在C#中,任何涉及BeginXXX与EndXXX名字的方法都是异步。
2、Invoke => 同步调用;
在Control中用以上2种方法都会造成界面假死,因为这是UI线程。
Winform界面Invoke用法示例:
public void TestFunction(int ms) { lblContent.Text += "开始;"; Thread.Sleep(ms); lblContent.Text += "结束"; } public void Main() { //this.Invoke(new Action<int>(TestFunction),3000); //输出字体与界面同步出现 this.BeinInvoke(new Action<int>(TestFunction),3000); //界面出现后假死,然后才出现输出字体。 lblContent.Text += "abc;"; }
执行结果:
Inoke:开始;结束;abc;
BeinInvoke:abc;开始;结束;
Winform界面委托用法示例:
public void TestFunction(int ms) { lblContent.Text += "开始;"; Thread.Sleep(ms); lblContent.Text += "结束"; } public void Main() { Action<int> action = TestFunction; //action.Invoke(3000); //界面输出字体与界面同步出现 action.BeinInvoke(3000, null, null); //界面不会假死,先出现“abc;开始;”,3秒后出现“结束;” lblContent.Text += "abc;"; }
执行结果:
Inoke:开始;结束;abc;
BeinInvoke:abc;开始;结束;