【问题标题】:How to check if object is created in the main thread [duplicate]如何检查是否在主线程中创建了对象[重复]
【发布时间】:2026-02-23 05:20:02
【问题描述】:

我在 WPF (C#) 中遇到了没有答案的问题,我需要一些帮助。

我想检查是否在主(UI)线程中创建了一个对象,有没有办法做到这一点?

(列表、集合等对象)

编辑

我正在尝试减少 Dispatcher.Invoke(和 Dispatcher.CheckAccsess)的使用,因为它会减慢系统速度。

我有一个对象,当它绑定到 UI 时我需要 Invoke,但很多时候它是在不同的线程中创建的,在 Invoke 中不需要它,它可以从当前线程设置。

【问题讨论】:

  • 你到底为什么要这么做?你能多谈谈你想要解决的问题吗?也许还有其他方法可以解决您遇到的任何问题。
  • 首先,定义“主线程”。
  • @DannyChen 我假设他指的是 UI 线程...
  • 诸如“列表、集合等”之类的对象没有任何线程关联性,因此实际上不可能,也不清楚您为什么要这样做。
  • @PeterBons,我编辑了您邀请查看的问题

标签: c# .net wpf multithreading mvvm


【解决方案1】:

您可以在扩展方法中进行检查:

public static void Invoke<T>(this T c, Action<T> action) where T : Control
{
    if (c.Dispatcher.CheckAccess()))
        control.Dispatcher.Invoke(...)
    else
        action(c);
}

(基于A better way to write extension method to invoke a control?

除了使用扩展方法来创建更好看的代码之外,没有办法检查使用什么踏板来创建对象。

你在使用异步/等待吗?因为这可能会减少这样做的需要。你能显示一些你从另一个线程访问 UI 的代码吗?也许你可以减少这种情况。

【讨论】: