1、 普通异步
普通异步,就是主线程用另外一个线程处理远程对象的方法,同时自己继续处理自己的事。可以等待异步线程完成,也可以不等待异步线程的结束,具体视应用场景而定。具体看下面的代码事例。由于远程对象及服务器端代码不会有任何变化,下面将只重点介绍客户端代码。
Ø 声明delegate
delegate double Addition(double addend, double augend);
Ø 处理代码
Addition addition = new Addition(calculator.Addition);
//采用异步处理远程对象方法。
IAsyncResult iAsyncResult = addition.BeginInvoke(firstNumber, secondNumber, null, null);
//异步线程没有完成,主经程等待异步纯种完成处理后,再继续执行。
if(!iAsyncResult.IsCompleted)
{
iAsyncResult.AsyncWaitHandle.WaitOne();
}
result = addition.EndInvoke(iAsyncResult);
2、 回调异步
回调异步比普通异步优化的等待。当主线程调用异步线程后,主线程可以不用管异步线程的处理结果,处理自己的代码。当异步线程完成后,异步线程会调用回调方法,将结果返回给主线程。事例代码如下:
Ø 声明delegate
delegate double Multiplication(double addend, double augend);
private Multiplication multiplication;
Ø 处理代码
multiplication = new Multiplication(calculator.Multiplication);
AsyncCallback ac = new AsyncCallback(CallBack);
//采用异步处理远程对象方法。注意增加了一个回调参数
IAsyncResult iAsyncResult1 = multiplication.BeginInvoke(firstNumber, secondNumber, ac, null);
Thread.Sleep(5000);
Ø 回调处理代码
public void CallBack(IAsyncResult iAsyncResult)
{
if (iAsyncResult.IsCompleted)
{
double result = multiplication.EndInvoke(iAsyncResult);
resultTextBox.Text = result.ToString();
}
}
3、 单向异步
单向异步和普通异步的执行效果是一样。不同在于,普通异步是由客户端代码来指定,而单赂异步通过在方法上面加一个[OneWay]标记,由远程对象自行处理。这样大大减少客户端的代码量。但是需要注意的是,单向异步只能运用在没有返回值的方法上,并且不能进行任何异尚处理。相当于,客户端执行远程对象方法后,至于这个远程对象处理成功与否都与客户端无关。事例代码如下:
[OneWay]
public void LongTimeCalculate()
{
}
浙公网安备 33010602011771号