任何一个都有很好的线程安全调用样本
本文关键字:线程 安全 调用 样本 很好 任何一 | 更新日期: 2023-09-27 18:00:12
我有一个函数LoadData
,其中包含大量的WinForm控件,它将数据从数据库加载到控件中。现在它变得很慢,我应该使用线程吗,如果是,那么请建议一个好的例子,我已经尝试了 MSDN 样本
但这对我来说没有用,它需要对我的代码进行大量更改。
我假设你有很多与UI交互的代码,你想从后台线程执行。
您可以添加如下方法:
private static void UpdateControl(Control control, Action action)
{
if (control.InvokeRequired)
control.Invoke(action);
else
action();
}
用法:
老
textBox.Text = "Something";
新增功能
UpdateControl(textbox, () => { textBox.Text = "Something" });
或扩展方法,以缩短用法
public static class ControlExtension
{
public static void UpdateControl(this Control control, Action<Control> action)
{
if (control.InvokeRequired)
control.Invoke((Action)(() => action(control)));
else
action(control);
}
}
用法:
textBox.UpdateControl(arg => arg.Text = "Something");
可以使用 .NET 4 中的 TPL 以可能更简单的方式处理此问题。 您需要做的就是传递适当的TaskScheduler
。 使用从 UI 上下文创建的TaskScheduler
,任何调用都可以轻松地包装到将根据需要在 UI 线程上执行的Task
中。
有关详细信息,请参阅我关于该主题的博客文章。
查看 BackgroundWorker
var bw = new BackgroundWorker();
bw.DoWork += (s, e) => e.Result = getAllBoxers();
bw.RunWorkerCompleted += (s, e) =>
{
var boxers = e.Result as List<Boxer>;
dgvBoxers.DataSource = boxers;
};
bw.RunWorkerAsync();
确保永远不要做任何影响DoWork
中的 GUI 的事情,因为 WinForms 不是线程安全的。