如果你還不知道什麼是非同步也不要緊,我們還是來看例項,通過例項來理解才是最深刻的。
在remoting中,我們可以使用以下幾種非同步的方式:
1、普通非同步
2、**非同步
3、單向非同步
乙個乙個來說,首先我們這麼修改我們的遠端物件:
public
intalongtimemethod(
inta,
intb,
inttime)
這個方法傳入2個引數,返回2個引數和表示方法執行成功,方法需要time毫秒的執行時間,這是乙個長時間的方法。
如果方法我們通過非同步遠端呼叫,這裡需要注意到這個方法輸出的行是在伺服器端輸出的而不是客戶端。因此,為了測試簡單,我們還是在採用本地物件,在實現非同步前我們先來看看同步的呼叫方法,為什麼說這是一種阻塞?因為我們呼叫了方法主線程就在等待了,看看測試:
datetime dt==
new1,2
,1000
));method();
console.writeline("用了
"+((timespan)(datetime.now
-dt)).totalseconds+"
秒");console.readline();
private
static
void
method()
好了,現在開始執行程式:
用了4秒,說明在我們的方法開始以後本地就一直在等待了,總共用去的時間=本地方法+遠端方法,對於長時間方法呼叫這顯然不科學!我們需要改進:
1、普通非同步:
首先在main方法前面加上委託,簽名和返回型別和非同步方法一致。
private
delegate
intmydelegate(
inta,
intb,
inttime);
main方法裡面這麼寫:
datetime dt==
newremoteobject.myobject();
mydelegate md
=new
=md.begininvoke(1,
2,1000
,null
,null
);method(); if(
!iar.iscompleted)
else
console.writeline("用了
"+((timespan)(datetime.now
-dt)).totalseconds+"
秒");console.readline();
class
myclient
public
static
void
callback(iasyncresult iar)
}private
static
void
method()}
可以看到我上面的注釋行,去掉遠端呼叫的注釋,對下面的本地呼叫注釋,編譯後啟動服務端,再啟動客戶端就是遠端呼叫了。
非同步呼叫結束,立即就能顯示出結果,如果開啟遠端方法的話,可以看的更加清晰:
客戶端:主線程方法開始-》服務端:非同步方法開始-》服務端:非同步方法結束-》客戶端:結果是3-》客戶端:主線程方法結束-》客戶端:用了3.03125秒。
3、單向非同步就是像同步呼叫方法那樣呼叫方法,方法卻是非同步完成的,但是不能獲得方法的返回值而且不能像同步方法那樣取得所呼叫方法的異常資訊!對於不需要返回資訊的長時間方法,我們可以放手讓它去幹就行了:
遠端物件:
using
system;
using
system.runtime.remoting.messaging;
namespace
remoteobject
} }
[oneway]屬性是remoting.messaging的一部分,別忘記using,下面看看客戶端**:
using
system;
namespace
remoteclient
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,...