WPF中的异步WCF服务 - 事件

kat*_*e77 3 memory wpf wcf memory-leaks mvvm-light

我在WPF应用程序中异步使用WCF服务.所以我上课了所有的网络服务.视图模型调用此proc中的方法,该方法又调用Web服务.

所以视图模型代码如下所示:

WebServiceAgent.GetProductByID(SelectedProductID, (s, e)=>{States = e.Result;});
Run Code Online (Sandbox Code Playgroud)

WebService代理看起来像:

    public static void GetProductByID(int ProductID, EventHandler<GetProductListCompletedEventArgs> callback)
    {
        Client.GetProductByIDCompleted += callback;
        Client.GetProductByIDAsync(ProductID);
    }
Run Code Online (Sandbox Code Playgroud)

这是一个好方法吗?我正在使用MVVM light toolkit.所以View Model是静态的,所以在应用程序的生命周期中,视图模型保持不变.但每次视图模型调用此WebServiceAgent时,我认为我正在注册一个事件.但该事件并未取消注册.

这是一个问题.让我们说视图模型被调用了20到30次.我插入某种内存泄漏?

小智 7

一些有用的信息,基于我从自己身上学到的错误:

  • Client对象似乎一直在重复使用.如果没有取消注册事件处理程序,当相同操作的未来调用完成并且您将获得不可预测的结果时,它们将堆叠起来.
  • States = e.Result语句在事件处理程序的线程上执行,该线程不是UI调度程序线程.更新列表或复杂属性时,这将导致问题.
  • 通常,在调用它们时不注销事件处理程序是一个坏主意,因为它确实会导致很难找到内存泄漏.

您应该重构以创建或重新使用干净的客户端,将viewmodel回调包装在另一个回调中,该回调将负责取消注册自身,清理客户端,以及在主调度程序线程上调用viewmodel的回调.

如果您认为这一切都很乏味,请查看http://blogs.msdn.com/b/csharpfaq/archive/2010/10/28/async.aspxhttp://msdn.microsoft.com/en-us/ vstudio/async.aspx.在下一版本的C#中,将引入async关键字以使这一切变得更加容易.CTP已经可用.