欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

异步委托

程序员文章站 2023-02-18 19:31:59
简介 委托(Delegate):就是类似于C/C++中的函数指针,由于C 中没有指针,使该语言存在着对某种方法的引用,该引用在运行时改变。被说成是:“委托可以把方法当作参数在另一个方法中传递和调用”,“委托是方法的快捷方式”等等,我的简单理解就是创建两个相同的函数,想用使用A函数,可以借助委托函数B ......

简介

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

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

委托

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

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

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 方法检索异步调用的结果。

iasyncresult 类型公开以下成员:
asyncstate :获取用户定义的对象,它限定或包含关于异步操作的信息
asyncwaithandle :获取用于等待异步操作完成的 waithandle
completedsynchronously :获取一个值,该值指示异步操作是否同步完成
iscompleted :获取一个值,该值指示异步操作是否已完成

总结

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