CheckForIllegalCrossThreadCalls

CheckForIllegalCrossThreadCalls

我最近将一个应用程序从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的文档中:



您需要纠正问题。

话虽如此,您提到:



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

请注意,您也可以使用Control.Invoke在一次调用中编码(marshal)对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/

10-09 07:18