为什么我们可以从线程池线程修改表单标题? [复制]

2023-11-29

下面的等待任务尚未完成await点并且它不捕获 UI 上下文。这意味着后面的 UI 修改代码将在另一个线程(本例中为线程池线程)中调用。

private async void Button1_Click(object sender, EventArgs e)
{
    StringBuilder sb = new StringBuilder();
    sb.Append($"{Thread.CurrentThread.ManagedThreadId}, ");

    Task t = Task.Delay(1000);
    await t.ConfigureAwait(false);

    sb.Append($"{Thread.CurrentThread.ManagedThreadId}");

    Text = sb.ToString();
}

上面的代码运行没有任何问题。运行时没有错误。

Question

为什么允许在非UI线程中修改UI组件? 难道是我的理解有问题?


除非附加了调试器,否则 winforms 中默认禁用跨线程检查。这个可以看到在初始化时checkForIllegalCrossThreadCalls field:

private static bool checkForIllegalCrossThreadCalls = Debugger.IsAttached;

如果我不得不猜测,我会说这是为了保持复古兼容性。 .NET 1.1 没有跨线程检查(当时我还想知道为什么我的应用程序会在几个小时后神秘地崩溃),它们是随 .NET 2.0 添加的。但这是一个巨大的突破性变化,我想这就是他们选择加入的原因。对于 WPF,立即引入了跨线程检查,因此他们可以为每个人激活它们。

鉴于此,我强烈建议在任何 winform 项目中手动启用跨线程检查,方法是将这一行添加到入口点:

[STAThread]
static void Main()
{
    Control.CheckForIllegalCrossThreadCalls = true;

    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我们可以从线程池线程修改表单标题? [复制] 的相关文章

随机推荐

  • ASP.NET MVC:使用递归助手生成多级菜单

    我使用此代码生成菜单 此菜单使用数据库 类别表 填充项目这项技术 部分视图 using SarbarzDarb Helper model IEnumerable
  • 选择行号 = rownum

    我一直在尝试运行此查询以按行号选择行 但我不断在 where 子句中收到未知的列 行 这个查询可以吗 SELECT row row 1 AS row pi FROM ci patient info pi where row 2 将其包裹在一
  • 在mfc中绘制背景

    我正在尝试使用 MFC 库在 C 中绘制窗口的背景 我必须使用这个框架 因为我正在开发 MFC 应用程序 我尝试了几种不同的方法 但无法使其发挥作用 所以我最近打开了一个空白项目 只是想弄清楚如何绘制背景 但它不起作用 任何帮助都会很棒 这
  • 如何解决从另一个实体(JPA)继承的实体的“未指定主键”?

    我想要一个所有文档类型都通用的超类 Entity public abstract class Doc implements Serializable Id GeneratedValue strategy GenerationType IDE
  • 如何在单个图中绘制多个seaborn.distplot

    我想绘制多个seaborndistplot在同一窗口下 每个图都有相同的 x 和 y 网格 我的尝试如下所示 但不起作用 function to plot the density curve of the 200 Median Stn MC
  • 避免打开模板参数

    简化后我有以下类层次结构 class BaseVec public BaseVec virtual BaseVec virtual double get double int i const 0 template
  • 在 R 中绘制连续函数

    我会如何绘制类似的东西y a b在 R 中 其中y等于某个常数并且a b gt 0 So a b 5例如 它绘制该线的位置 我只见过传递值列表a and b和绘图y根据这些值 不绘制连续曲线 f lt function a b a b 我该
  • ModuleNotFoundError:没有名为“psycopg2._psycopg”的模块

    我正在使用进口 导入psycopg2 但是在本地运行代码时 我面临一个问题 从 psycopg2 psycopg 导入 ModuleNotFoundError 没有名为 psycopg2 psycopg 的模块 我已经使用 cmd pip
  • 如何修复应用程序不响应?

    我已经准备好了绘画应用程序 我的应用程序包含一个用于绘画的自定义视图 当我们在自定义视图中绘制任何内容时 只需收集绘制的像素并存储在数组列表中 第一次它工作正常 但需要很多时间 第二次 活动 MyAlphabets 在应用程序 MyAlph
  • C# - 网站 - SQL Select 语句

    我想使用 select 语句来查找是否存在已存在的记录 我已将代码放在下面 但它在 dReader comm ExecuteReader 处引发错误我不确定为什么 有什么帮助吗 string connString Data Source K
  • 在 AS3 中隐藏按钮?

    我有一个名为 myBtn 的按钮 在第一帧的操作中 我尝试了以下两种方法 myBtn visibility false myBtn enabled false 两者都给我同样的错误 1120 访问未定义的属性 myBtn 好的 有几种方法可
  • 如何使用网络摄像头扫描 WinUI 3 中的二维码?

    我正在尝试在 WinUI 3 中从网络摄像头扫描 QR 码 我已经安装了 ZXing 和 AForge Video 但这些库在 WinUI 3 中无法正常工作 是否有任何解决方案或更兼容的替代方案 ZXing 中兴网是一个端口 完全与平台无
  • 绑定到 Django Admin 的模型历史记录

    设置 我正在开发一个 Django 应用程序 它允许用户在数据库中创建一个对象 然后返回并根据需要进行编辑 Django 的管理站点保存通过管理站点对对象所做的更改的历史记录 问题 如何将我的应用程序挂接到管理站点的更改历史记录中 以便我可
  • lua 中的来回 UTC 日期

    我在将 lua 日期转换为时间戳然后从中获取原始日期时遇到问题 它确实适用于非 UTC 日期 但不适用于 UTC 目前我的示例代码是 local dt1 os date t print dt1 hour local dt2 os date
  • MySQL 错误 1349 我缺少什么?

    我正在获取 MySQL1349错误 但看起来错误似乎不正确 ERROR 1349 View s SELECT contains a subquery in the FROM clause 创建视图时可以没有任何子查询吗 这是我的 SQL C
  • Spark:当键是不可散列的numpy数组时如何“reduceByKey”?

    我有一个 键 值 元素的 RDD 键是 NumPy 数组 NumPy 数组不可散列 当我尝试执行以下操作时 这会导致问题reduceByKey手术 有没有办法为 Spark 上下文提供我的手动哈希函数 或者有没有其他方法可以解决这个问题 除
  • 如何将此 JSON 反序列化为对象?

    我正在尝试使用 JSON Net 将 JSON 对象反序列化为 C 对象 我想要创建的对象是MonthlyPerformance其中包含一个列表Type 其中包含一个列表Categories 其中又包含一个列表Funds 它们定义为 pub
  • HttpClient 在指定超时之前超时

    我正在使用 WP8 中的 HttpClient 并执行 Post 请求 我知道呼叫可能需要很长时间 因为我实际上是在模拟慢速网络场景 因此我设置了HttpClient Timeout相应地为5分钟 然而 我在 60 秒左右超时 我相信超时不
  • 将依赖项注入 Ember 模型

    我正在尝试将依赖项注入我的 Ember 模型中 https github com emberjs ember js issues 3670 表明此功能已禁用 通过链接访问https github com stefanpenner ember
  • 为什么我们可以从线程池线程修改表单标题? [复制]

    这个问题在这里已经有答案了 下面的等待任务尚未完成await点并且它不捕获 UI 上下文 这意味着后面的 UI 修改代码将在另一个线程 本例中为线程池线程 中调用 private async void Button1 Click objec