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中。我真的很想要最好的方法
给你。如果您对并发收集没有信心,那么:
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);
}
}
}
希望得到帮助。