任何一个都有很好的线程安全调用样本

本文关键字:线程 安全 调用 样本 很好 任何一 | 更新日期: 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 不是线程安全的。