Remoting之非同步操作模式

2021-04-22 04:44:18 字數 1432 閱讀 3983

用了4秒,說明在我們的方法開始以後本地就一直在等待了,總共用去的時間=本地方法+遠端方法,對於長時間方法呼叫這顯然不科學!我們需要改進:

現在總共執行時間接近於主線程的執行時間了,等於是呼叫方法基本不占用時間。

分析一下**:iar.asyncwaithandle.waitone(); 是阻塞等待非同步方法完成,在這裡這段**是不會被執行的,因為主方法完成的時候,非同步方法早就iscompleted了,如果我們修改一下**:iasyncresult iar=md.begininvoke(1,2,5000,null,null);

在實際的運用中,主線程往往需要得到非同步方法的結果,也就是接近於上述的情況,我們在主線程做了少量時間的工作以後最終要是要waitone去等待非同步操作返回的結果,才能繼續主線程操作。看第二個圖可以發現,非同步操作僅僅用了1秒,但是要等待3秒的主線程方法完成後再返回結果,這還是不科學啊。因此,我們要使用委託**的非同步技術。

2、**非同步:

class myclient

}private static void method()

}可以看到我上面的注釋行,去掉遠端呼叫的注釋,對下面的本地呼叫注釋,編譯後啟動服務端,再啟動客戶端就是遠端呼叫了。

非同步呼叫結束,立即就能顯示出結果,如果開啟遠端方法的話,可以看的更加清晰:

客戶端:主線程方法開始-》服務端:非同步方法開始-》服務端:非同步方法結束-》客戶端:結果是3-》客戶端:主線程方法結束-》客戶端:用了3.03125秒。

3、單向非同步就是像同步呼叫方法那樣呼叫方法,方法卻是非同步完成的,但是不能獲得方法的返回值而且不能像同步方法那樣取得所呼叫方法的異常資訊!對於不需要返回資訊的長時間方法,我們可以放手讓它去幹就行了:

遠端物件:

using system;

using system.runtime.remoting.messaging;

namespace remoteobject

}       

} [oneway]屬性是remoting.messaging的一部分,別忘記using,下面看看客戶端**:

using system;

private static void method()}}

這次我們僅僅只能在遠端除錯,我們先讓非同步方法去做,然後就放心的做主執行緒的事情,其他不管了。

執行結果我描述一下:

客戶端:主線程方法開始-》服務端:非同步方法開始-》服務端:非同步方法結束-》客戶端:主線程方法結束-》客戶端:用了3.8秒。

上面說的三種方法,只是非同步程式設計的一部分,具體怎麼非同步呼叫遠端方法要結合實際的例子,看是否需要用到方法的返回和主線程方法的執行時間與遠端方法執行時間等結合起來考慮,比如上述的waithandle也可以用輪詢來實現:

while(iar.iscompleted==false) system.threading.thread.sleep(10);總的來說遠端物件的非同步操作和本地物件的非同步操作是非常接近。

一步一步學Remoting之五 非同步操作

如果你還不知道什麼是非同步也不要緊,我們還是來看例項,通過例項來理解才是最深刻的。在remoting中,我們可以使用以下幾種非同步的方式 1 普通非同步 2 非同步 3 單向非同步 乙個乙個來說,首先我們這麼修改我們的遠端物件 word break break all padding top 4px...

一步一步學Remoting之五 非同步操作

如果你還不知道什麼是非同步也不要緊,我們還是來看例項,通過例項來理解才是最深刻的。在remoting中,我們可以使用以下幾種非同步的方式 1 普通非同步 2 非同步 3 單向非同步 乙個乙個來說,首先我們這麼修改我們的遠端物件 public intalongtimemethod inta,intb,...

一步一步學Remoting之五 非同步操作

如果你還不知道什麼是非同步也不要緊,我們還是來看例項,通過例項來理解才是最深刻的。在remoting中,我們可以使用以下幾種非同步的方式 1 普通非同步 2 非同步 3 單向非同步 乙個乙個來說,首先我們這麼修改我們的遠端物件 public intalongtimemethod inta,intb,...