关于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();
}
}
}
结果: