摘抄自文章:.NET中的异步编程html
异步编程中重要的技术点在于:编程
1)当异步线程在工做完成时,如何通知调用线程?多线程
2)当异步线程出现异常的时,该如何处理?异步
3)异步线程工做的进度,如何实时的通知调用线程?async
4)如何在调用线程中,取消正在工做的异步线程,并进行回滚操做?异步编程
完整的异步调用例子:函数
class Program { public delegate int DoWord(int count); static void Main(string[] args) { DoWord d = new DoWord(WorkPro); IAsyncResult r= d.BeginInvoke(100,CallBack ,d);//no.1 for (int i = 0; i < 100; i++) { Thread.Sleep(10);//主线程须要作的事 } Console.WriteLine("主线程done"); Console.ReadKey(); } public static int WorkPro(int count) { int sum = 0; //作一些耗时的工做 for (int i = 0; i < count; i++) { sum += i; Thread.Sleep(10); } return sum; } public static void CallBack(IAsyncResult r) { DoWord d = (DoWord)r.AsyncState; Console.WriteLine("异步调用完成,返回结果为{0}", d.EndInvoke(r)); } }
以上被博主称之为异步函数模型。post
Thread类this
class Program { static void Main(string[] args) { Thread t = new Thread(WorkPro);//no.1 t.IsBackground = true;//no.2 t.Start(1000);//no.3 } public static void WorkPro(object t) { //作一些耗时的工做 int count=(int)t; for (int i = 0; i < count; i++) { Thread.Sleep(2000); } Console.WriteLine("任务处理完成"); } }
Task类url
public partial class Form1 : Form { private readonly TaskScheduler contextTaskScheduler;//声明一个任务调度器 public Form1() { InitializeComponent(); contextTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext();//no.1得到一个上下文任务调度器 } private void button1_Click(object sender, EventArgs e) { Task<int> t = new Task<int>((n) => Sum((int)n),100); t.Start(); t.ContinueWith(task =>this.textBox1 .Text =task.Result.ToString(),contextTaskScheduler);//当任务执行完以后执行 t.ContinueWith(task=>MessageBox .Show ("任务出现异常"),CancellationToken.None ,TaskContinuationOptions.OnlyOnFaulted,contextTaskScheduler );//当任务出现异常时才执行 } int Sum(int count) { int sum = 0; for (int i = 0; i < count; i++) { Thread.Sleep(10); sum += i; } Console.WriteLine("任务处理完成"); return sum; } }
这是一个比较完整的Task应用例子。详情能够阅读摘抄的博客原文。
博客:Winform实现多线程异步更新UI(进度及状态信息)
有个完整的使用多线程的例子。代码比较复杂。
------------------------------
20190907更新
文章:C#异步的世界【上】
写了早期C#中实现异步的方法。
文章:C#异步的世界【下】
和上篇配合看