【发布时间】:2023-03-19 04:00:01
【问题描述】:
在执行我的 win forms 应用程序时,我会遇到一个跨线程异常,这似乎是一个随机的机会。以下是我尝试管理它的方式:
private void ToOutput(string s)
{
if (!this.IsHandleCreated)
this.CreateHandle();
if (FormOutputArea.InvokeRequired)
{
FormOutputArea.Invoke(new Action(delegate ()
{
FormOutputArea.AppendText(s + Environment.NewLine);
}));
}
else
{
FormOutputArea.AppendText(s + Environment.NewLine);
}
}
看来InvokeRequired 并不总是准确的。我尝试了BeginInvoke,结果相同。
编辑:即使我使用断点检查IsHandleCreated 和InvokeRequired,它们也设置为true,但条件的else 分支仍会执行。
这是一个屏幕截图,显示了现在抛出异常的位置:
【问题讨论】:
-
您可能想查看以下内容:stackoverflow.com/questions/808867/…
-
即使检查控制句柄是否已创建也无济于事。我很困惑为什么连续运行五次(〜20%的机会)时抛出一次线程异常。
-
即使当我使用断点检查 IsHandleCreated 和 InvokeRequired 时,它们也会设置为 true,但条件的 else 分支会被执行。 你能告诉这段代码你在这个中尝试了什么吗?
-
this在这里指的是什么? -
我希望
this会引用此方法所在的类。我最初使用FormOutputArea.IsHandleCreated但是当表单区域对象没有CreateHandle方法时将其更改为this,无济于事。
标签: c# .net multithreading thread-safety