gpt4 book ai didi

c# - 将线程安全访问方法写入 Windows 窗体控件的最短方法

转载 作者:IT王子 更新时间:2023-10-29 04:18:36 25 4
gpt4 key购买 nike

在本文中:

http://msdn.microsoft.com/en-us/library/ms171728(VS.80).aspx

作者使用以下方法对 Windows 窗体控件进行线程安全调用:

private void SetText(string text)
{
// InvokeRequired required compares the thread ID of the
// calling thread to the thread ID of the creating thread.
// If these threads are different, it returns true.
if (this.textBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.textBox1.Text = text;
}
}

有没有更短的方法来完成同样的事情?

最佳答案

C# 3.0 及之后的版本:

扩展方法通常是可行的方法,因为您总是希望对 ISynchronizeInvoke interface 执行操作实现,这是一个很好的设计选择。

您还可以利用 anonymous methods (闭包)以说明您不知道将哪些参数传递给扩展方法的事实;闭包将捕获所需一切的状态。

// Extension method.
static void SynchronizedInvoke(this ISynchronizeInvoke sync, Action action)
{
// If the invoke is not required, then invoke here and get out.
if (!sync.InvokeRequired)
{
// Execute action.
action();

// Get out.
return;
}

// Marshal to the required context.
sync.Invoke(action, new object[] { });
}

然后你可以这样调用它:

private void SetText(string text)
{
textBox1.SynchronizedInvoke(() => textBox1.Text = text);
}

这里,闭包在 text 参数上,该状态被捕获并作为 Action delegate 的一部分传递传递给扩展方法。

C# 3.0 之前:

您没有 lambda 表达式的奢侈,但您仍然可以概括代码。它几乎相同,但不是扩展方法:

static void SynchronizedInvoke(ISynchronizeInvoke sync, Action action)
{
// If the invoke is not required, then invoke here and get out.
if (!sync.InvokeRequired)
{
// Execute action.
action();

// Get out.
return;
}

// Marshal to the required context.
sync.Invoke(action, new object[] { });
}

然后你用匿名方法语法调用它:

private void SetText(string text)
{
SynchronizedInvoke(textBox1, delegate() { textBox1.Text = text; });
}

关于c# - 将线程安全访问方法写入 Windows 窗体控件的最短方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/571706/

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