对于WCF事件的重复调用、消息的重复提示,基本都属于Service Client类定义成全局字段,事件的重复注册造成的。
不过我们可以通过一些办法来解决这个问题。这里总结了一下,供参考。
一、取消Service Client类定义成全局字段,在每次使用时初始化,调用:
using(var myServiceClient = new MyServiceClient())
{
myServiceClient.DoSomethingCompleted += (sender, args) =>
{
MessageBox.Show("Doodo");
};
myServiceClient.DoSomethingAsync();
}
二、定义成全局变量,仅在Load时或者构造函数内注册一次事件:
Public MyClass()
{
myServiceClient.DoSomethingCompleted += new EventHandler<DoSomethingCompletedEventArgs>(myServiceClient_DoSomethingCompleted);
}
其他地方再用 myServiceClient.DoSomethingAsync();
三、执行时注册(+=),执行成功后取消注册(-=):
就是在myServiceClient_DoSomethingCompleted方法这里加入取消注册操作
myServiceClient.DoSomethingCompleted -=
new EventHandler<DoSomethingCompletedEventArgs>(myServiceClient_DoSomethingCompleted);
四、还有更猛的,定义成全局静态的,在Application_Startup时初始化,把所有事件执行一次初始化操作,这样对于一个应用程序只需做一次操作。
每次调用的时候,判断下连接状态Open、Close.