c#异步调用一个带返回值的方法并获取返回值

委托可以进行同步调用和异步调用。
委托的同步调用用Invoke方法实现。同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行。同步调用会阻塞线程,如果是要调用一项繁重的工作(如大量IO操作),可能会让程序停顿很长时间,造成糟糕的用户体验,这时候异步调用就很有必要了。
委托的异步调用通过BeginInvoke和EndInvoke来实现。异步调用不阻塞线程,而是把调用塞到线程池中,程序主线程或UI线程可以继续执行。

首先,声明委托并创建委托实例,委托要和方法有相同的参数和返回类型
public delegate int AsyncDelegate(int a);
private AsyncDelegate mydlgt = new AsyncDelegate(MyFunc);

了解一下BeginInvoke的原型
IAsyncResult AsyncDelegate.BeginInvoke(int a,AsyncCallback asyncCallback,object @object)
BeginInvoke方法触发你的异步方法,它和你想要执行的异步方法有相同的参数。另外还有两个可选参数,第一个是AsyncCallback委托是异步完成的回调方法。第二个是用户自定义对象,该对象将传递到回调方法中。
//开启异步执行方法MyFunc
IAsyncResult result = mydlgt.BeginInvoke(asyncCallback,null);

//异步调用的方法
private int MyFunc(int a)
{
}
AsyncCallback asyncCallback = new AsyncCallback(AsyncCallbackFunc);

//回调方法
public void AsyncCallbackFunc(IAsyncResult ar)
{
		int r = mydlgt.EndInvoke(ar);//在回调方法中结束异步,并获取返回值
}

也可以在主线程中结束异步,当主线程运行到EndInvoke时,如果这时异步调用没有结束(这种情况很可能出现),这时为了等待调用结果,线程依旧会被阻塞。
mydlgt.EndInvoke(result);

因此,用回调函数,当调用结束时会自动调用回调函数,解决了为等待调用结果,而让线程依旧被阻塞的局面。

你可能感兴趣的:(C#)