HTML5技术

C#异步的世界【上】 - 农码一生(2)

字号+ 作者:H5之家 来源:H5之家 2017-01-18 13:00 我要评论( )

private void button4_Click( object sender, EventArgs e) {Debug.WriteLine( + Thread.CurrentThread.ManagedThreadId);MyBeginXX( new AsyncCallback(t = { var result = MyEndXX(t);Debug.WriteLine( + result.

private void button4_Click(object sender, EventArgs e) { Debug.WriteLine(+ Thread.CurrentThread.ManagedThreadId); MyBeginXX(new AsyncCallback(t => { var result = MyEndXX(t); Debug.WriteLine(+ result.Trim().Substring(); Debug.WriteLine(+ Thread.CurrentThread.ManagedThreadId); })); Debug.WriteLine(+ Thread.CurrentThread.ManagedThreadId); }

效果图:

农码一生

我们看到自己实现的效果基本上和系统提供的差不多。

  • 启用异步方法并没有是UI界面卡死
  • 异步方法启动了另外一个ID为11的线程
  • 【总结】

    个人觉得APM异步模式就是启用另外一个线程执行耗时任务,然后通过回调函数执行后续操作。

    APM还可以通过其他方式获取值,如:

    while (!asyncResult.IsCompleted)//循环,直到异步执行完成 (轮询方式) { Thread.Sleep(100); } var stream2 = request.EndGetResponse(asyncResult).GetResponseStream();

    asyncResult.AsyncWaitHandle.WaitOne();//阻止线程,直到异步完成 (阻塞等待) var stream2 = request.EndGetResponse(asyncResult).GetResponseStream();

     

    补充:如果是普通方法,我们也可以通过委托异步:(BeginInvoke、EndInvoke)

    public void MyAction() { var func = new Func<string, string>(t => { Thread.Sleep(2000); + t + DateTime.Now.ToString(); }); , t => { string str = func.EndInvoke(t); Debug.WriteLine(str); }, null); }

    EAP

    EAP 基于事件的异步模式,Event-based Asynchronous Pattern

    此模式在C#2的时候随之而来。

    先来看个EAP的例子:

    private void button3_Click(object sender, EventArgs e) { Debug.WriteLine(+ Thread.CurrentThread.ManagedThreadId); BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += new DoWorkEventHandler((s1, s2) => { Thread.Sleep(2000); Debug.WriteLine(+ Thread.CurrentThread.ManagedThreadId); });//注册事件来实现异步 worker.RunWorkerAsync(this); Debug.WriteLine(+ Thread.CurrentThread.ManagedThreadId); }

     

    【效果图】(同样不会阻塞UI界面)

    【特征】

  • 通过事件的方式注册回调函数
  • 通过 XXXAsync方法来执行异步调用
  • 例子很简单,但是和APM模式相比,是不是没有那么清晰透明。为什么可以这样实现?事件的注册是在干嘛?为什么执行RunWorkerAsync会触发注册的函数?

    感觉自己又想多了...

    我们试着反编译看看源码:

     只想说,这么玩,有意思吗?

    TAP

    TAP 基于任务的异步模式,Task-based Asynchronous Pattern

    到目前为止,我们觉得上面的APM、EAP异步模式好用吗?好像没有发现什么问题。再仔细想想...如果我们有多个异步方法需要按先后顺序执行,并且需要(在主进程)得到所有返回值。

    首先定义三个委托:

    public Func<string, string> func1() { return new Func<string, string>(t => { Thread.Sleep(2000); + t; }); } public Func<string, string> func2() { return new Func<string, string>(t => { Thread.Sleep(2000); + t; }); } public Func<string, string> func3() { return new Func<string, string>(t => { Thread.Sleep(2000); + t; }); }

    然后按照一定顺序执行:

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • 那些年搞不懂的术语、概念:协变、逆变、不变体 - 农码一生

      那些年搞不懂的术语、概念:协变、逆变、不变体 - 农码一生

      2016-08-30 17:00

    • 用canvas画简单的“我的世界”人物头像 - 玉菲莎

      用canvas画简单的“我的世界”人物头像 - 玉菲莎

      2016-07-27 14:00

    • JS运动从入门到兴奋1 - 沫晴的前端世界

      JS运动从入门到兴奋1 - 沫晴的前端世界

      2016-07-16 11:00

    • 过目不忘JS正则表达式 - 沫晴的前端世界

      过目不忘JS正则表达式 - 沫晴的前端世界

      2016-07-14 14:00

    网友点评
    '