WPF中ViewModel上的线程锁定

本文关键字:线程 锁定 ViewModel WPF | 更新日期: 2023-09-27 18:00:59

我有一个WPF应用程序,它使用同一类的两个对象调用Web服务异步。来自调用的两个事件处理程序的结果响应集合应放入作为UI数据绑定的同一字典中。我的问题是,当Web服务返回集合并试图插入到同一词典中时,会出现线程锁定。

public class myClass : Window
{
    public MyService serv1 {get;set;}
    public MyService serv2 {get;set;}
    public ObservableDictionary<string, MySertvice> dict = new ObservableDictionary<string, MySertvice>();
    public ObservableDictionary<string, MySertvice> Dict_VM {get;set;}

    public myClass()
    {
        InitializeComponent()
        this.DataContext = Dict;
        serv1 = new MyService("serviceA");
        serv1.CallBack += CallBack;
        serv2 = new MyService("serviceB");
        serv2.CallBack += CallBack;
    }
    public Window_Loaded(object sender, WindowloadedEventArgs e)
    {
        serv1.DoServiceCallAsync();
        Debug.WriteLine("- first call");
        serv2.DoServiceCallAsync();
        Debug.WriteLine("- second call");
    }
    public void CallBack(object sender, CallBackEventArgs e)
    {
        Debug.WriteLine("- callback");
        foreach(var name in e.ResultCollection)
        {
            dict.Add(name, sender as MyService);
        }
    }
}

输出为:

  • 第一次呼叫
  • 第二次呼叫
  • 回调
  • 回调

我的问题是,让它线程安全的最佳方法是什么?

这只是一个样本,所以逻辑逻辑并不重要。我想要ResultCollection的每一个元素。我的第一个想法是将结果传输到Queue或ConcurrentQueue中,并让后台工作人员将其从Queue处理到Dictionary中。我真的很想要最好的方法

WPF中ViewModel上的线程锁定

给你。如果您对并发收集没有信心,那么:

private Object thisLock = new Object();
public void CallBack(object sender, CallBackEventArgs e)
{
    Debug.WriteLine("- callback");
    lock(thisLock )
    {            
        foreach(var name in e.ResultCollection)
        {
            dict.Add(name, sender as MyService);
        }
    }
}

希望得到帮助。