经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
异步委托
来源:cnblogs  作者:永远的你  时间:2018/12/5 10:00:56  对本文有异议

简介

委托(Delegate):就是类似于C/C++中的函数指针,由于C#中没有指针,使该语言存在着对某种方法的引用,该引用在运行时改变。被说成是:“委托可以把方法当作参数在另一个方法中传递和调用”,“委托是方法的快捷方式”等等,我的简单理解就是创建两个相同的函数,想用使用A函数,可以借助委托函数B进行调用。关键字为delegate。
想要深入理解委托,可以学习一下这篇文章深入理解委托

在winForm开发过程中经常用到线程,又是会遇到在多线程中访问线程外的空间。,比如:设置textbox的Text属性等等。如果直接设置程序必 定会报出:从不是创建控件的线程访问它,这个异常。
通常我们可以采用两种方法来解决。
一是通过设置control的属性。
二是通过delegate,而通 过delegate也有两种方式,一种是常用的方式,另一种就是匿名方式。

委托

.NET中对invoke和begininvoke的官方定义:
control.invoke(参数delegate)方法:在拥有此控件的基础窗口句柄的线程上执行指定的委托。
control.begininvoke(参数delegate)方法:在创建控件的基础句柄所在线程上异步执行指定委托。
从而得知:invoke表是同步、begininvoke表示异步

下面举例一个委托使用的例子:

  1. delegate void SafeSetText(string strMsg);
  2. private void SetText(string strMsg)
  3. {
  4. if(textbox1.InvokeRequired)
  5. {
  6. SafeSetText objSet=new SafeSetText(SetText);
  7. textbox1.Invoke(objSet,new object[]{strMsg});
  8. }
  9. else
  10. {
  11. textbox1.Text=strMsg;
  12. }
  13. }

异步委托

.NET Framework 允许您异步调用任何方法。 为此,应定义与您要调用的方法具有相同签名的委托;公共语言运行时会自动使用适当的签名为该委托定义 BeginInvoke 和 EndInvoke 方法。

下面是一个异步委托的例子:

  1. static void Main()
  2. {
  3. //synchronous method call
  4. //TakesAWhile(1 , 3000);
  5. //asynchronous by using a delegate
  6. TakesAWhileDelegate d1 = TakesAWhile;
  7. IAsyncResult ar = d1.BeginInvoke(1, 3000, null ,null);
  8. while(!ar.IsCompleted)
  9. {
  10. //doing something else in the main thread
  11. Console.Write(".");
  12. Thread.Sleep(50);
  13. }
  14. int result = d1.EndInvoke(ar);
  15. Console.WriteLine("Result:{0}",result);
  16. }

TakesAWhile为需要委托函数,
TakesAWhileDelegate 为委托函数,
BeginInvoke 方法启动异步调用。
BeginInvoke方法返回一个 IAsyncResult,用来监视异步调用的进度,
EndInvoke 方法检索异步调用的结果。

IAsyncResult 类型公开以下成员:
AsyncState :获取用户定义的对象,它限定或包含关于异步操作的信息
AsyncWaitHandle :获取用于等待异步操作完成的 WaitHandle
CompletedSynchronously :获取一个值,该值指示异步操作是否同步完成
IsCompleted :获取一个值,该值指示异步操作是否已完成

总结

该文章对委托和异步委托做了一个介绍与区别说明,不是很深入,后期再补。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号