如何查询正在运行的线程

本文关键字:运行 线程 何查询 查询 | 更新日期: 2023-09-27 18:30:30

在我的程序中,我利用此答案中使用的AddOnUI扩展方法将对象从后台工作线程添加到ObservableCollection

我正在使用的扩展方法:

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());

如何查询正在运行的线程

System.Threading.Thread.CurrentThread告诉您正在使用的线程,可以与Dispatcher.Thread属性进行比较。

检查线程是一个笨拙的解决方案。您根本不需要它,因为内部框架确保在正确的线程上调度操作。

问题很可能是您正在添加对象asynchronously (BeginInvoke)。添加对象synchronously (Invoke),您将看到该项目立即添加到集合中。

取代

Application.Current.Dispatcher.BeginInvoke(addMethod, item);

Application.Current.Dispatcher.Invoke(addMethod, item);