这样做效率低于设置后台工作线程吗?因为它运作良好,看起来更干净。在循环中,我调用BeginInvoke 3x - 向主窗口datagrid添加行,并更新进度条和消息。
public MyConstructor()
{
InitializeComponent();
ThreadStart start = delegate()
{
for (...)
{
...
MyWindow.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
new Action(delegate()
{
// Do something on the MyWindow thread.
}
));
...
}
// Intensive loop now done and we close this processing window.
this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
new Action(delegate()
{
this.Close();
}
));
}; // ThreadStart
new Thread(start).Start();
}
答案 0 :(得分:4)
对我来说,它看起来并不干净...... 但除此之外,我认为没有理由不这样做。但是我也没有理由,因为没有使用BackgroundWorker:
private void BWDoWork(...)
{
for (...)
{
// ...
worker.ReportProgress(...);
}
}
private void BWReportProgress(...)
{
// do something on the MyWindow thread
}
private void BWCompleted(...)
{
this.Close();
}
对我来说看起来更干净,因为你在线程和UI更新中完成的实际工作有点分离......
答案 1 :(得分:2)
这是好的,但有几点:
你并没有非常清楚地确定'有效'的资格,但是BackgroundWorker 通常是做这种事情的更好方法 - 如果不出意外,它将使用池线程,这很多比手动创建的线程便宜。