如何查询正在运行的线程

时间:2014-11-14 18:25:37

标签: c# wpf multithreading observablecollection

在我的程序中,我使用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());

2 个答案:

答案 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);