我有一个带有大量WinForm控件的函数LoadData
,它将数据从数据库加载到控件中。
现在它变得非常慢,我应该使用线程,如果是,那么请提示一个好的样本,我已经尝试了MSDN sample
但它对我没用,它需要对我的代码进行大量更改。
答案 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)
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不是线程安全的。