【问题标题】:Why does passing an object instance to the UI thread like this cause delays/hang ups?为什么像这样将对象实例传递给 UI 线程会导致延迟/挂断?
【发布时间】:2015-09-09 09:58:04
【问题描述】:

我在 UI 框架中实现了以下回调方法:

private void OnSystemMessage(string senderId, SystemMessage msg)
{
    Application.Current.Dispatcher.Invoke(() =>
    {
        ActivityLog.Add(msg);
    });
}

OnMessage 可能由不同于 UI 线程的调用。但是,第一次调用它需要几秒钟。后来,同样的延迟不再可观察到。我不明白为什么会这样。

ActivityLogObservableCollection,UI 线程是我的 WPF 应用程序之一。

是否有更好的方法来实现相同的目标?

谢谢

【问题讨论】:

  • 不清楚标题中的“移动对象实例”是什么意思……没有这样的概念。也许延迟是由于加载 UI 资源或类似的原因?没有更多信息很难知道。 (您需要 Invoke,还是 BeginInvoke 适合您?)
  • 抱歉,我的意思是在第一次调用 OnSystemMessage 时会导致延迟。你提出的BeginInvoke实际上可能已经回答了这个问题:我可能有一个阻塞条件,BeginInvoke 可能工作得很好。
  • @JonSkeet,谢谢你的建议,乔恩。它解决了我的问题。
  • @MattWolf 您可以致电Dispatcher.CheckAccess() 来检查您是否需要Invoke....
  • @m0sa,很有趣,感谢您的指点

标签: c# multithreading user-interface task marshalling


【解决方案1】:

因此,当您第一次调用 OnSystemMessage 时,很可能 UI 线程正忙于某些事情。例如,您可能会在应用程序启动时记录一些消息,而应用程序正忙于初始加载界面。那么这个电话可能会延迟一点。由于您只是登录此方法 - 使用非阻塞 BeginInvoke 调用。

【讨论】:

    猜你喜欢
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    相关资源
    最近更新 更多