异步委托

简介

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

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

委托

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

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

delegate void SafeSetText(string strMsg);
private void SetText(string strMsg)
{
 if(textbox1.InvokeRequired)  //判断是否已经申请回调
 {
    SafeSetText objSet=new SafeSetText(SetText); //实例回调对象,后面进行执行
    textbox1.Invoke(objSet,new object[]{strMsg});   //执行回调
 }
 else
 {
   textbox1.Text=strMsg;            //控件显示
 }
}

异步委托

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

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

static void Main()
{
//synchronous method call
//TakesAWhile(1 , 3000);

//asynchronous by using a delegate
TakesAWhileDelegate d1 = TakesAWhile;
IAsyncResult ar = d1.BeginInvoke(1, 3000, null ,null); //执行异步委托
while(!ar.IsCompleted)
{
    //doing something else in the main thread
    Console.Write(".");
    Thread.Sleep(50);
}
int result = d1.EndInvoke(ar);  //获取异步委托的结果
Console.WriteLine("Result:{0}",result);
}

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

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

总结

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

相关文章
相关标签/搜索