一箭工作室

大家一起来学软件开发

博客园 首页 新随笔 联系 订阅 管理
  由于远程对象通常会处理很长时间,再加上网络传输问题。因此,在客户端调用远程方法时,通常会采用异步来调用,远程对象调用的异步处理和本地对象调用的异步处理基本相同。异步通常有三种:

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()

{

}

posted on 2007-02-12 08:56  一箭  阅读(538)  评论(0)    收藏  举报