gpt4 book ai didi

c# - CheckForIllegalCrossThreadCalls=false 的后果

转载 作者:太空狗 更新时间:2023-10-29 22:55:50 25 4
gpt4 key购买 nike

我最近将一个应用程序从 VS2003 更新到 VS2008,我知道我会处理大量“跨线程操作无效:控件‘myControl’从创建它的线程以外的线程访问”我是以我认为正确的方式处理这个问题(参见下面的代码示例)。我遇到了许多需要类似修复的控件。不希望非 UI 线程正在访问的每个标签、文本框等都有类似的代码。为整个应用设置 CheckForIllegalCrossThreadCalls = false 会产生什么后果?

我找到了一个 CodeProject带有各种解决方法的文章,底部有一条警告不要设置该属性。我正在寻找关于这个问题的其他意见/经验。

private void ShowStatus(string szStatus)
{
try
{
if (this.statusBar1.InvokeRequired) { BeginInvoke(new MethodInvoker(delegate() { ShowStatus(szStatus); })); }
else { statusBar1.Panels[0].Text = szStatus; }
}
catch (Exception ex)
{
LogStatus.WriteErrorLog(ex, "Error", "frmMNI.ShowStatus()");
}
}

我找到了另一篇文章,其中包含一些可能的解决方案 SO Question 2367718

最佳答案

当你不调试时,你仍然会遇到问题。

来自 Control.CheckForIllegalCrossThreadCalls 的文档:

Note that illegal cross-thread calls will always raise an exception when an application is started outside the debugger.

您需要更正这些问题。

话虽如此,您提到:

Not wanting to have similar code for every label, textbox etc.. that are being accessed by a non UI thread.

我会重新考虑这个立场。您应该尝试将在单独线程上运行的逻辑移动到单独的方法或类中,这反过来会使将调用编码回 UI 变得更加简单。随着时间的推移,这将使您的代码更加可靠和可维护。

请注意,您也可以使用 Control.Invoke 在一次调用中编码对 UI 的一整套调用,而不是单独执行每个单独的集合操作。当你完成时,它们真的不应该有那么多。

编辑:

例如,听起来您正在加载数据。假设您有(在您的后台线程上)您的数据加载方法:

var myData = LoadData();
this.Invoke( new Action( () =>
{
// Just set all of your data in one shot here...
this.textBox1.Text = myData.FirstName;
this.textBox2.Text = myData.LastName;
this.textBox3.Text = myData.NumberOfSales.ToString();
}));

关于c# - CheckForIllegalCrossThreadCalls=false 的后果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2587930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com