从异步 WCF 方法多次调用委托
Delegate called multiple times from asynchronous WCF method
在客户端应用程序中,我正在使用从以下代码调用的异步 WCF 方法:
public void doActiveDx()
{
this.dataservice.GetActiveDxCompleted += (s,e) =>
{
...do something...
};
this.dataservice.GetActiveDxAsync( );
}
doActiveDx()只调用一次,为什么delegate被调用多次?
在我的例子中,...做某事...,正在更新绑定到显示器的可观察集合,因此多次调用委托会导致显示器出现闪烁效果。
如何在 doActiveDx() 完成时调用委托???
TIA
每次执行对 doActiveDx
的调用时,都会再次注册委托。这会导致在后续调用 doActiveDx
.
时多次调用委托
确保您只注册了一次委托。例如,尝试在 doActiveDx
函数之外注册它。
@Thiago-Sá 关于您遇到的问题是正确的。我现在将给你一些关于如何修复它的提示。
如果可能,将GetActiveDxAsync()
return设为Task
。然后你可以在你的委托中添加一个continuation,如下所示:
this.dataservice.GetActiveDxAsync()
.ContinueWith(() =>
{
// do something
};
如果您使用的是 .Net 4.5 和 C# 5,您也可以使用 async/await(前提是任务像第一点一样 return):
await this.dataservice.GetActiveDxAsync();
// do something after the completion
其他说明:在我自己实现的WCF服务中,我经常在客户端使用代理。这个代理继承自ClientBase,每次我需要打电话的时候都会创建。所以我经常得到如下代码:
var proxy = new DataServiceProxy();
proxy.GetActiveDxCompleted += (s,e) =>
{
try
{
// do something
}
finally
{
proxy.Close();
}
};
proxy.GetActiveDxAsync();
这意味着,由于每次都是一个新实例,因此您不会有多个调用。
在客户端应用程序中,我正在使用从以下代码调用的异步 WCF 方法:
public void doActiveDx()
{
this.dataservice.GetActiveDxCompleted += (s,e) =>
{
...do something...
};
this.dataservice.GetActiveDxAsync( );
}
doActiveDx()只调用一次,为什么delegate被调用多次?
在我的例子中,...做某事...,正在更新绑定到显示器的可观察集合,因此多次调用委托会导致显示器出现闪烁效果。
如何在 doActiveDx() 完成时调用委托???
TIA
每次执行对 doActiveDx
的调用时,都会再次注册委托。这会导致在后续调用 doActiveDx
.
确保您只注册了一次委托。例如,尝试在 doActiveDx
函数之外注册它。
@Thiago-Sá 关于您遇到的问题是正确的。我现在将给你一些关于如何修复它的提示。
如果可能,将GetActiveDxAsync()
return设为Task
。然后你可以在你的委托中添加一个continuation,如下所示:
this.dataservice.GetActiveDxAsync()
.ContinueWith(() =>
{
// do something
};
如果您使用的是 .Net 4.5 和 C# 5,您也可以使用 async/await(前提是任务像第一点一样 return):
await this.dataservice.GetActiveDxAsync();
// do something after the completion
其他说明:在我自己实现的WCF服务中,我经常在客户端使用代理。这个代理继承自ClientBase,每次我需要打电话的时候都会创建。所以我经常得到如下代码:
var proxy = new DataServiceProxy();
proxy.GetActiveDxCompleted += (s,e) =>
{
try
{
// do something
}
finally
{
proxy.Close();
}
};
proxy.GetActiveDxAsync();
这意味着,由于每次都是一个新实例,因此您不会有多个调用。