我有一个与WCF服务器通信的WCF客户端(C#)。这个客户端异步调用。我想知道以下是好主意还是坏主意:
从我的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);
}
我可以将Client存储为类成员,但是如果我正在进行许多可能变得复杂的同步异步调用。 (例如,如果代理在我进行一次异步调用时死机,我需要创建一个新的代理。但我仍然需要旧的代理能够在其他未完成的异步调用上调用.EndFunction。
答案 0 :(得分:3)
这应该工作得很好。另一种方法是使用lambda表达式或匿名委托,这样就可以在完成的代码中使用相同的局部变量。
使用lambda表达式的示例
client.BeginLogin(user, pass,
ar =>
{
LoginResult result = client.EndLogin(ar);
Console.WriteLine(result);
}, null);