任何人都有良好的线程安全呼叫样本?

时间:2011-06-23 06:18:48

标签: c# winforms multithreading c#-4.0 parallel-processing

我有一个带有大量WinForm控件的函数LoadData,它将数据从数据库加载到控件中。 现在它变得非常慢,我应该使用线程,如果是,那么请提示一个好的样本,我已经尝试了MSDN sample

但它对我没用,它需要对我的代码进行大量更改。

3 个答案:

答案 0 :(得分:1)

我假设你有很多与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");

答案 1 :(得分:0)

您可以使用.NET 4中的TPL以更简单的方式处理此问题。您需要做的就是传递适当的TaskScheduler。使用从UI上下文创建的TaskScheduler,可以轻松地将任何调用包装到将根据需要在UI线程上执行的Task

有关详细信息,请参阅我的blog post on the subject

答案 2 :(得分:0)

查看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不是线程安全的。