gpt4 book ai didi

c# - 线程方法问题

转载 作者:太空狗 更新时间:2023-10-30 00:03:58 26 4
gpt4 key购买 nike

我正在使用以下方法来显示无模式消息框。

public void ShowMessageBox(string Message)
{
var thread = new Thread(
() =>
{
MessageBox.Show(Message);
});
thread.Start();
}

“() => {...}”是我以前从未见过的东西。此代码模式的名称是什么?

此外,thread.Start 启动线程,一旦“()=>{...}”方法完成(当消息框确定时)它会自动关闭,对吧?如果是这样,你能给我指点一些官方文档说线程自动关闭吗?

谢谢!

最佳答案

它是 lambda 运算符,读作“转到”。 MSDN 有一个很好的介绍:Lambda Expressions (C# Programming Guide)

您的示例的一个问题是您正在启动一个新线程来更新 UI,UI 本质上是单线程的,因此后台更新通常是错误的做法(除非您手动/显式检查InvokeRequired 并根据需要调用 Invoke()


关于 UI 线程...

在 WinForms 中每 FormControl是在特定线程(“UI 线程”)上创建的,您可以认为该线程拥有该控件(不完全正确,但概念化它的好方法)。从该线程更新 UI 是安全的,从另一个线程更新 UI 存在冲突和损坏的风险以及并行/异步编程的所有常见风险。

...那么...您如何在不阻塞 UI 的情况下从后台线程安全地更新 UI?简而言之——你不能——你能做的最好的事情就是在更新 UI 所需的最低限度时阻止它。这是InvokeRequired的地方和 Invoke()进来……

这是一个示例:您应该能够将其放入带有按钮和文本框的新表单的代码隐藏中。

使用:

  • 尝试注释掉对 SetTextAsyncSafe() 的调用或 SetTextAsyncSafe() -- 同时运行两者可能会让您感到困惑,因为它们不一定会按照调用的顺序执行(它们正在异步运行,还记得吗?)。

  • 然后在SetText()上设置断点.您应该会看到“安全”调用实际上会调用该方法两次——第一次调用会检测到 InvokeRequired。并将通过 Invoke() 为正确的线程第二次调用该方法正在处理它。

  • SetTextAsyncUnsafe() 时,您应该会看到抛出的异常。实际上到达了textBox1.Text = value;声明。异常将是 InvalidOperationException并显示一条消息,指出“跨线程操作无效”——您可以通过谷歌搜索此术语以获取更多详细信息。

代码:

private void button1_Click(object sender, EventArgs e)
{
SetTextAsyncSafe("This update was made from the UI Thread by using Invoke()");
SetTextAsyncUnsafe("This update was made directly from the background thread and can cause problems");
}

private void SetTextAsyncUnsafe(string value)
{
new Thread(() => SetText(value, false)).Start();
}

private void SetTextAsyncSafe(string value)
{
new Thread(() => SetText(value, true)).Start();
}

private void SetText(string value, bool checkInvokeRequired)
{
if (checkInvokeRequired)
{
if (InvokeRequired)
{
Invoke(new Action(() => SetText(value, checkInvokeRequired)));
return; // early exit
}
}

textBox1.Text = value;
}

关于c# - 线程方法问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3318640/

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