2009-10-23 54 views
1

我有一個與WCF服務器通信的WCF客戶端(C#)。這些客戶端正在異步地進行呼叫。我想知道以下是好還是壞主意:在WCF中傳遞代理對象asyncState

從我的WCF客戶端調用異步操作時,我將對象asyncState變量設置爲代理對象。在我的回調函數中,我從AsyncState值中提取代理對象並在其上調用.EndFunction。

例子:

public void Login() 
{ 
    Client client = CreateWCFProxy(); 
    client.BeginLogin(user, pass, OnLoginCompleted, client); 
} 

public void OnLoginCompleted(IAsyncResult result) 
{ 
    Client client = result.AsyncState as Client; 
    LoginResult loginResult = client.EndLogin(result); 
} 

我可以存儲客戶端作爲一個類的成員,但如果我做很多併發異步調用可能變得複雜。 (例如,如果代理在我進行一次異步調用時死亡,我需要創建一個新的代理,但我仍然需要舊的代理才能在其他優異的異步調用上調用.EndFunction。

回答

3

這應該使用lambda表達式

client.BeginLogin(user, pass, 
    ar => 
    { 
     LoginResult result = client.EndLogin(ar); 
     Console.WriteLine(result); 
    }, null); 
+0

嗯工作得很好。另一種方法是使用lambda表達式或匿名委託,所以你可以在你完成的代碼使用相同的局部變量。

一個例子,你的意思是我應該通過,而不是「OnLoginCompleted」? – Nitramk 2009-10-23 16:32:55

+0

我添加了一些示例代碼的答案。 – Maurice 2009-10-23 20:07:22

+0

我很愚蠢不認爲ab我自己。謝謝。 – Nitramk 2009-10-25 19:01:05