在我的程序中,我使用this answer中使用的ObservableCollection
扩展方法,从后台工作线程向AddOnUI
添加对象。
我正在使用的扩展方法:
public static void AddOnUI<T>(this ICollection<T> collection, T item)
{
Action<T> addMethod = collection.Add;
Application.Current.Dispatcher.BeginInvoke( addMethod, item );
}
...
collection.AddOnUI(new B());
此解决方案适用于从后台工作线程添加的集合对象。但是,如果仅在UI线程上手动添加集合对象而不涉及后台线程,则集合不会填充到数据中,也不会填充在视图中。有没有办法在从ObservableCollection
调用add方法时查询哪个线程处于活动状态?
也许做这样的事情?:
if(calling from background thread)
collection.AddOnUI(new B());
else //Manually adding from UI Thread
collection.Add(new B());
解决方案:
我的解决方案最终与我的伪代码很相似,我非常喜欢。
if(System.Threading.Thread.CurrentThread.IsBackground)
collection.AddOnUI(new B());
else //Manually adding from UI Thread
collection.Add(new B());
替代解决方案:
AddOnUI()
(将BeginInvoke
更改为Invoke
):
public static void AddOnUI<T>(this ICollection<T> collection, T item)
{
Action<T> addMethod = collection.Add;
Application.Current.Dispatcher.Invoke(addMethod, item);
}
collection.AddOnUI(new B());
答案 0 :(得分:2)
System.Threading.Thread.CurrentThread
告诉您您正在使用哪个帖子,可以与Dispatcher.Thread
属性进行比较。
答案 1 :(得分:1)
检查线程是一个hacky解决方案。您根本不需要它,因为框架内部确保在正确的线程上调度操作。
最有可能的问题是你要添加对象asynchronously (BeginInvoke)
。添加对象synchronously (Invoke)
,您将看到该项目立即添加到集合中。
替换
Application.Current.Dispatcher.BeginInvoke(addMethod, item);
与
Application.Current.Dispatcher.Invoke(addMethod, item);