在Parallel.For完成工作后引发事件

时间:2011-09-11 13:09:06

标签: c# wpf multithreading events

按下按钮后跟随功能。

Task.Factory.StartNew(() => 
{ 
    Parallel.For(0, cyclesCount, i => DoWork(i));

    if (OnJobCompleted != null)
        OnJobCompleted(this, EventArgs.Empty);                
});

此外,在代码中还有

void ladder_OnJobCompleted(object sender, EventArgs args)
{
    txbDebug.Text = "completed";
}

我知道

txbDebug.Text = "completed";

必须被调用,因为我在不同的线程上引发事件。但我无法弄清楚,如何调用它。此事件位于wpf格式

2 个答案:

答案 0 :(得分:4)

使用Dispatcher

txbDebug.Dispatcher.Invoke(new Action(() =>
{
    txbDebug.Text = "completed";
}));

答案 1 :(得分:2)

我不希望您想要使用新的Async CTP,但如果您对使用为C#5提议的新asyncawait关键字如何做到这一点感到好奇,那么考虑以下示例。它真的没有比这更优雅。

void async YourButton_Click(object sender, RoutedEventArgs args)
{
  txbDebug.Text = await Task<string>.Factory.StartNew(
    () =>
    {
      Parallel.For(0, cyclesCount, i => DoWork(i));
      return "complete";
    });
}