首页 / C# / C# - 多线程之 异步编程
C# - 多线程之 异步编程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C# - 多线程之 异步编程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3729字,纯文字阅读大概需要6分钟。
内容图文
异步编程
- 同步编程,请求响应模型,同步化、顺序化、事务化。
- 异步编程,事件驱动模型,以 Fire and Forget 方式实现。
异步编程模式
?-§-?异步编程模型 (APM) 模式: IAsyncResult 模式,异步操作需要 Begin 和 End 方法;
?-§-?基于事件的异步模式(EAP):事件、事件处理程序委托类型和 EventArg 派生类型;
?-§-?基于任务的异步模式(TAP):推荐模式,.NET Framework 4 引入,基于 System.Threading.Tasks 命名空间,利用一种方法表示异步操作的启动和完成;
?类 LogicalMethodInfo 提供 Invoke 和 BeginInvoke 方法支持同步或异步执行委托的方法:
public sealed class System.Web.Services.Protocols.LogicalMethodInfo{ public object[] Invoke(object target, object[] values); public IAsyncResult BeginInvoke(object target, object[] values, AsyncCallback callback, object asyncState); public object[] EndInvoke(object target, IAsyncResult asyncResult); }
?其中,target 是委托方法所属的类实例,values 是委托方法的参数列表。
异步方法调用模式
?三种方法调用模式区别:原线程获取异步线程已经完成的消息的方式。
?
? 其中,BeginInvoke 方法用于启动异步调用,EndInvoke 方法用于检索并获取异步调用结果然后释放线程占用的资源。BeginInvoke 立即返回,不等待异步方法调用完成,同时在调用时创建一个 AsyncResult 类对象,但是 BeginInvoke 返回 IAsyncResult 接口的引用,可用于监视异步方法的调用进度,调用 BeginInvoke 后可随时调用 EndInvoke 方法。
?
? 其中,IAsyncResult 接口 的 AsyncState 属性获取 Object 类型的对象可以作为 BeginInvoke 方法调用时的 State 参数(可根据需要自定义)。 委托定义和异步委托方法定义为:
public delegate int MyDel(string str); public static int DelFun(string str){ Console.WriteLine("异步线程执行方法:DelFun() in " + Thread.CurrentThread.ManagedThreadId); Thread.Sleep(3000); return str.Length; }
注:BeginInvoke 的参数是在编译时根据委托的定义动态生成的,前面参数的个数和类型与委托定义中的参数个数和类型相同,后两个参数分别是 AsyncCallback 和 Object 类型。BeginInvoke 的调用者的方法列表有且只能有一个方法。BeginInvoke 第三个参数可为任意类型,最终都可通过 AsyncState 属性获得对应值。
等待模式 Waiting-Until-Done
如果异步方法调用未完成,EndInvoke 将一直阻塞到异步方法调用完成才执行。其中,等待 WaitHandle 是一项常用的线程同步技术,可以通过 BeginInvoke 返回的 IAsyncResult 的 AsyncWaitHandle 属性调用 WaitOne() 方法阻止当前线程,直到获取到异步方法调用完成时发出的 WaitHandle 信号。
public static void AsyncWaitingTest() { MyDel myDel = new MyDel(TestClass.DelFun); Console.WriteLine("主线程:AsyncWaitingTest() in " + Thread.CurrentThread.ManagedThreadId); IAsyncResult iar = myDel.BeginInvoke("sqh", null, null); Console.WriteLine("主线程继续执行... in " + Thread.CurrentThread.ManagedThreadId); while (!iar.AsyncWaitHandle.WaitOne(1000)){ Console.WriteLine("Waiting... AsyncMethod()"); } int strLen = myDel.EndInvoke(iar); Console.WriteLine("Str Length:{0}", strLen); }
轮询模式 Polling
利用 BeginInvoke 返回的 IAsyncResult 的 IsCompleted 属性来判断异步方法调用是否完成。
public static void AsyncPollingTest() { MyDel myDel = new MyDel(TestClass.DelFun); Console.WriteLine("主线程:AsyncPollingTest() in " + Thread.CurrentThread.ManagedThreadId); IAsyncResult iar = myDel.BeginInvoke("sqh", null, null); Console.WriteLine("主线程继续执行... in " + Thread.CurrentThread.ManagedThreadId); while (!iar.IsCompleted){ Thread.Sleep(1000); Console.WriteLine("Waiting... AsyncMethod()"); } int strLen = myDel.EndInvoke(iar); Console.WriteLine("Str Length:{0}", strLen); }
回调模式 Callback
调用 BeginInvoke 时提供回调方法,异步方法调用结束后,回调方法在 ThreadPool 中的异步线程上自动执行,并调用 EndInvoke 方法。
回调方法形如:void AsyncCallback(IAsyncResult iar);
public static void AsyncCallbackTest() { MyDel myDel = new MyDel(TestClass.DelFun); Console.WriteLine("主线程:AsyncCallbackTest() in " + Thread.CurrentThread.ManagedThreadId); IAsyncResult iar = myDel.BeginInvoke("sqh", CallbackMethod, myDel); Console.WriteLine("主线程继续执行... in " + Thread.CurrentThread.ManagedThreadId); // ... 其他操作,独立于异步线程 } public static void CallbackMethod(IAsyncResult iar) { Console.WriteLine("异步方法执行完毕,开始执行回调方法 in " + Thread.CurrentThread.ManagedThreadId); //AsyncResult ar = (AsyncResult)iar; // **推荐** //MyDel myDel = (MyDel)ar.AsyncDelegate; MyDel myDel = (MyDel)iar.AsyncState; // 这种调用方式 BeginInvoke 需要 myDel 参数 int result = myDel.EndInvoke(iar); Console.WriteLine(result); }
其他:当委托的方法列表中有多个方法时,可以利用 GetInvocationList() 方法得到 Delegate[] 数组,然后依次调用 BeginInvoke 方法,不同的方法在线程池的不同线程上运行!
参考
[1]. 异步编程模式系列(1-6);
[2]. 异步方法调用模式总结; 异步调用四种方法;
原文:http://www.cnblogs.com/wjcx-sqh/p/5929883.html
内容总结
以上是互联网集市为您收集整理的C# - 多线程之 异步编程全部内容,希望文章能够帮你解决C# - 多线程之 异步编程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。