如何查询正在运行的线程
本文关键字:运行 线程 何查询 查询 | 更新日期: 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);