gpt4 book ai didi

c# - 为什么我没有收到 "Cross-thread operation not valid"错误

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

我使用 BackgroundWorker 并执行此操作:

private void loadNewAsyncToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Text = "RunWorkerAsync()";
backgroundWorkerLoading.RunWorkerAsync();
}
private void backgroundWorkerLoading_DoWork(object sender, DoWorkEventArgs e)
{
UnsafeThreadMethod("hello");
EvenUnsaferThreadMethod();
}

现在是两种方法。

private void UnsafeThreadMethod(string text)
{
toolStripLabelRssFeedData.Text = text;
}

private void EvenUnsaferThreadMethod()
{
panelLoading.Visible = true;
}

我不明白为什么 UnsafeThreadMethod 不会抛出以下异常,但 EvenUnsaferThreadMethod 会。

Cross-thread operation not valid: Control 'panelLoading' accessed from a thread other than the > thread it was created on.

根据消息,这是因为 toolStripLabelRssFeedData 是在同一线程上创建的,但事实并非如此。

我想我不能调用主线程创建的控件,必须使用 ProgressChanged 事件。怎么回事?

我还有第二个问题。当我可以使用 ProgressChanged 时,这样做有什么好处?我该怎么办?

private void EvenUnsaferThreadMethod()
{
if (panelLoading.InvokeRequired)
{
panelLoading.Invoke(new MethodInvoker(() => { EvenUnsaferThreadMethod(); }));
}
else
{
panelLoading.Visible = true;
}
}

最佳答案

第一个问题:

  • Debug模式故意抛出跨线程异常。这意味着大多数 GUI 控件中内置了对 InvokeRequired 的(有条件的)代码检查。就像小组一样。

  • 显然 ToolstripLabel 不会进行此检查。由于它不是从 Control 派生的,因此可能是因为它超出了该安全网的范围。

由于标准免责声明“不保证任何实例成员都是线程安全的”适用于 ToolstripLabel,因此我在设置文本时将使用正常的 InvokeRequired 逻辑。

关于c# - 为什么我没有收到 "Cross-thread operation not valid"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9758876/

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