c# - 我可以从后台线程更新 UI,为什么?

标签 c# .net multithreading winforms

大家都知道,从后台线程更新 UI 是不允许的(或者不允许?)

我做了一个小实验。这是一段代码:

var thread = new Thread(() => progressBar1.Increment(50));
            thread.IsBackground = true;
            thread.Start();
            thread.Join();

我将此代码放入某个按钮单击处理程序中。知道什么吗?我的进度条正在递增......来自后台线程。现在我很困惑。我不明白这怎么可能,我做错了什么

最佳答案

I can update UI from background thread, why?

很可能您可以在调试器之外运行时执行此操作。这是因为该保护由 Control.CheckForIllegalCrossThreadCalls Property 控制.来看看reference source

private static bool checkForIllegalCrossThreadCalls = Debugger.IsAttached;
public static bool CheckForIllegalCrossThreadCalls {
    get { return checkForIllegalCrossThreadCalls; }
    set { checkForIllegalCrossThreadCalls = value; }
}

如您所见,此保护仅在调试时默认启用。

如果您在 Main 方法中添加以下行(在 Application.Run 之前)

Control.CheckForIllegalCrossThreadCalls = true;

您的代码将不再有效。

关于c# - 我可以从后台线程更新 UI,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34374045/

相关文章:

c# - 如何在 Specflow 中一次性注入(inject)配置?

c# 7.0 : switch on System. 类型

c# - .NET 随机数生成 - 自动种子

.net - 线程池和发送电子邮件

c# - 我在 Mysql 中遇到希伯来语问题。我与 Visualstudio10、连接器和 linq 一起使用。我能做些什么?

c# - 异步/等待并打开 FileStream?

c# - 确定对象是否是任何 Predicate<T>

python - 在 Python 中的任意时间后中断方法执行

java - Java中如何终止匿名线程

java - 从 ScheduleAtFixedRate 转换为 CachedThreadPool