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

2021-04-13 07:12:54 字數 2591 閱讀 8796

如果你還不知道什麼是非同步也不要緊,我們還是來看例項,通過例項來理解才是最深刻的。

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

來看一下執行結果:

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

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

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

2、**非同步:

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

一步一步學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,...