c# - WindowsFormsSynchronizationContext.Current.Post 在后台线程上执行 lambda

标签 c# multithreading winforms

将 lambda 表达式发布到当前 WindowsFormsSynchronizationContext 时,我发现 lambda 代码在后台线程上执行:

// running on main thread here

myLabel = new Label();
this.Controls.Add(myLabel);

WindowsFormsSynchronizationContext.Current.Post( ignore => {

    // returns true !
    bool invokeRequired = myLabel.InvokeRequired; 

    // returns a background thread, not the UI thread
    int threadId = System.Threading.Thread.CurrentThread.ManagedThreadId; 

    // throws, because we are (unexpectedly) on a background, different thread
    myLabel.Text = "whatever";

},null);

此外,WindowsFormsSynchronizationContext.Current 似乎没有返回 WindowsFormsSynchronizationContext,而是一个普通的 System.Threading.SynchronizationContext

这突然发生在一个曾经没有线程问题并且最近没有修改过的表单上(解决方案的其他部分是)。我曾尝试寻找明显的错误(例如,在后台线程上实例化表单本身的代码,或在后台线程上创建的控件),但我未能找到重大违规行为。

也许我看错方向了?

最佳答案

WindowsFormsSynchronizationContext.CurrentSynchronizationContext.Current 相同。您应该会收到编译器警告,提示您正在通过派生类调用基本静态成员。

检查 SynchronizationContext.Current.GetType(),您会发现您正在不同的同步上下文中运行。

在 UI 线程上捕获正确的上下文并将其存储。

关于c# - WindowsFormsSynchronizationContext.Current.Post 在后台线程上执行 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17677626/

相关文章:

c# - 如何强调功能区按钮标签的字符?

objective-c - 方法困惑的线程安全

c# - 限制非数值运算

c# - 辅助轴标签不起作用?

c# - C# 中双引号中的 String.Format

c# - 如何获取 IEnumerable(非泛型)的第一个元素?

c# - 一个类中的测试是否保证不会同时执行?

线程间共享的 Ruby TCPServer 套接字

c++ - 待定并发容器性能

c# - 如何从通过 USB 连接的相机读取文件