您好,欢迎访问一九零五行业门户网

C#的异步回调函数

关于c#的异步回调,在actionscript 3.0当中 , 有关键字function , 可以直接传class函数为回调函数。但是在c#当中,需要使用到委托,其中应用的最多的当属 : action / func 。当然你可以使用关键字delegate来自定义委托。这里翼action /  func为例来讲解c#的异步回调,如果不了解c#的委托机制,需要自己先百度/google一下,再来看这篇博客。
begininvoke 方法用于启动异步调用。它与您需要异步执行的方法具有相同的参数,只不过还有后面的两个额外的参数:第一个 : 异步调用执行完毕后的回调函数 , 此函数有一个参数 : iasyncresult 。第二个为状态object,可以传任意的值 , 用iasyncresult.asyncstate进行接收。
需要注意的是 : 对于有return(返回值)的异步调用函数,如何获得其返回值 : endinvoke方法,值得注意的endinvoke方法 : 可在异步调用结束后的回调函数中执行 ,也可以在异步调用代码后执行 : 只是这回当作是同步函数执行(异步函数被当作同步函数执行),理解为 , 现在就想拿到return结果,所以停留在此,等待结果return后,再往后面执行,相当于同步函数。
好了 , 结束废话 , 上正文:
1using system; using system.collections.generic; using system.linq; using system.text; using system.threading.tasks; namespace anyccallback161005.com { public class anyc { private dictionary noreturndic; private dictionary hasreturndic; public anyc() { this.noreturndic = new dictionary(); this.hasreturndic = new dictionary(); } public void doaction(action callback , int a , int b ) { if(callback != null) { if(this.noreturndic.containskey(callback)) { callback.endinvoke(this.noreturndic[callback]);//强制执行上回的callback } this.noreturndic[callback] = callback.begininvoke(a, b, this.doactioncomplete, callback); } } private void doactioncomplete( iasyncresult ar ) { action callback = ar.asyncstate as action; this.noreturndic.remove(callback); } public void dofunc( func callback , int a , int b ) { if(callback != null) { if(this.hasreturndic.containskey(callback)) { int re = callback.endinvoke(this.hasreturndic[callback]); console.writeline(得到的结果为 {0} , re); } this.hasreturndic[callback] = callback.begininvoke(a,b,this.dofunccomplete,callback); } } private void dofunccomplete(iasyncresult ar) { func callback = ar.asyncstate as func; int re = callback.endinvoke(ar); console.writeline(得到的结果为* {0} , re); this.hasreturndic.remove(callback); } } }
//调用代码 :
using system; using system.collections.generic; using system.linq; using system.text; using system.threading.tasks; using anyccallback161005.com; namespace anyccallback161005 { class program { static void main(string[] args) { action testactionanyc = ( a , b ) =>console.writeline(action得到的结果 : {0},(a+b).tostring()); func testfuncanyc = (a, b) => a + b; anyc anyc = new anyc(); anyc.doaction(testactionanyc, 3, 4); anyc.doaction(testactionanyc, 3, 5); anyc.doaction(testactionanyc, 3, 6); anyc.dofunc(testfuncanyc, 7, 8); anyc.doaction(testactionanyc, 3, 7); anyc.doaction(testactionanyc, 3, 8); console.read(); } } }
结果:
其它类似信息

推荐信息