【问题标题】:TPL issue when DEBUG mode, in Release mode all is okay调试模式下的 TPL 问题,在发布模式下一切正常
【发布时间】:2021-07-15 14:42:38
【问题描述】:

为什么我得到一个异常:{ InvalidOperationException: 跨线程操作无效:控件'lblText' 从创建它的线程以外的线程访问 }:在调试模式下运行应用程序时?:

namespace testFormApp
{
    public partial class Form1 : Form
    {
        public Form1() => InitializeComponent();

        private void Form1_Load(object sender, EventArgs e)
        {
            lblText.Click += (send, arg) => Need = false;
        }

        bool Need = true;

        private async void ButtonStart_Click(object sender, EventArgs e)
        {
            await Task.Run(async() =>
            {
                lblText.Text = "";
                while(Need)
                {
                    lblText.Text += ". ";
                    await Task.Delay(1000);
                }
            });
        }
    }
}

但相同的代码在发布模式下工作没有问题。为什么会报错?

【问题讨论】:

  • 除了原因(我强烈怀疑发布模式不可重现)和修复之外,上面的代码设计得很糟糕。你能告诉我们代码背后的想法吗?
  • 我正在尝试学习主题:取消任务的方法 |现在使用布尔变量,在此之后我将检查取消令牌
  • Task.Run 将在不得访问 UI 元素的线程池线程上运行您的代码。只需删除await Task.Run(async() =>
  • 他的代码有问题,但我的代码没有问题。代码在发布模式下正常工作,但在调试模式下我收到该错误。在 Visual Studio 之外,如果我转到应用程序文件夹并打开我的应用程序,他将正常工作,因为代码没有问题。我的英语不好抱歉,我知道如何解释我的问题。

标签: c# multithreading runtime-error


【解决方案1】:

查看 Hans Passant 对此问题的回答,Why is cross thread operation exception not thrown while running exe in bin\Debug 他说只有在附加调试器时才启用跨线程错误检查,您也可以手动禁用跨线程错误检查

Control.CheckForIllegalCrossThreadCalls = false;

【讨论】:

  • 所以它看起来像是一个编译器用来拯救可怜的程序员的方法
  • 这是答案。谢谢大家。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
相关资源
最近更新 更多