gpt4 book ai didi

c# - 无法在单元测试中复制 'cross-thread operation not valid'错误-我不明白

转载 作者:行者123 更新时间:2023-12-03 12:49:51 24 4
gpt4 key购买 nike

这是我的第一个Stack问题,因此,如果我的格式或礼节稍有不足,请提前道歉。

我最近一直在设置从单独的线程与WinForms控件进行交互时处理'cross-thread operation not valid' issues的模式。

我认为最好建立一个单元测试来隔离此问题,并断言我的SynchronisationContext扩展解决了这个问题,所以我创建了一个简单的测试表单,上面有一个按钮,并且从另一个线程调用了一些代码“PerformClick()”复制问题:

    [STAThread]
static void Main()
{
using (TestForm form = new TestForm())
{
Thread t1 = new Thread(() => Application.Run(form));
Thread t2 = new Thread(() => form.buttonStart.PerformClick());
form.Activated += (sender, args) => t2.Start();
t1.Start();
Thread.Sleep(1000); //Prevents form from being disposed before 'click' can occur from other thread.
}
}

测试表格实际上是一个空表格,上面有一个按钮。当我运行这段代码时,我得到了预期的跨线程操作异常。

但是,当我将代码放入NUnit测试中时,不会发生异常。这是我的单元测试:
    [Test]
public void PostToControl_AcrossThreads()
{
//Notes: This code normally generates a cross-thread exception.
//For some reason, when you run it in the scope of the unit test, the exception is not generated.
using (TestForm form = new TestForm())
{
Thread t1 = new Thread(() => Application.Run(form));
Thread t2 = new Thread(() => form.buttonStart.PerformClick());
form.Activated += (sender, args) => t2.Start();
t1.Start();
Thread.Sleep(1000); //Prevents form from being disposed before 'click' can occur from other thread.
}
}

我意识到我不知道为什么会发生这种情况,所以我把它扔给了专家:-)

谁能启发我?与 native 运行表单相比,单元测试中发生了什么变化?

最佳答案

此行为由以下属性控制:Control.CheckForIllegalCrossThreadCalls

默认情况下,仅当连接了调试器时,这才是正确的,这就是您所看到的行为。

关于c# - 无法在单元测试中复制 'cross-thread operation not valid'错误-我不明白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8025205/

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