我試圖瞭解何時使用TaskEx.Run
。我提供了兩個我寫在下面的代碼示例,可以產生相同的結果。我看不出就是爲什麼我會採取 Task.RunExTaskEx.RunEx
方法,我敢肯定有一個很好的理由,並希望有人能填補我進去。何時使用TaskEx.Run與TaskEx.RunEx
async Task DoWork(CancellationToken cancelToken, IProgress<string> progress)
{
int i = 0;
TaskEx.RunEx(async() =>
{
while (!cancelToken.IsCancellationRequested)
{
progress.Report(i++.ToString());
await TaskEx.Delay(1, cancelToken);
}
}, cancelToken);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
if (button.Content.ToString() == "Start")
{
button.Content = "Stop";
cts.Dispose();
cts = new CancellationTokenSource();
listBox.Items.Clear();
IProgress<string> progress = new Progress<string>(s =>
{
listBox.Items.Add(s);
listBox.ScrollIntoView(listBox.Items[listBox.Items.Count - 1]);
});
DoWork(cts.Token, progress);
}
else
{
button.Content = "Start";
cts.Cancel();
}
}
我可以達到同樣的效果像這樣
async Task DoWork(CancellationToken cancelToken)
{
int i = 0;
while (!cancelToken.IsCancellationRequested)
{
listBox.Items.Add(i++);
listBox.ScrollIntoView(listBox.Items[listBox.Items.Count - 1]);
await TaskEx.Delay(100, cancelToken);
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
if (button.Content.ToString() == "Start")
{
button.Content = "Stop";
cts.Dispose();
cts = new CancellationTokenSource();
listBox.Items.Clear();
DoWork(cts.Token);
}
else
{
button.Content = "Start";
cts.Cancel();
}
}
上述線程討論了TaskEx.RunEx的原因,它的所有變化都無法放入CTP的核心.NET功能中,但會被正確集成以供最終版本發佈 – 2012-02-17 20:27:10
已更改'任務.RunEx'到'TaskEx.RunEx'在Async CTP'Task'類中沒有'Run()'和'RunEx()'。他們都在'TaskEx'中。糾正我,如果我錯了 – 2013-04-10 04:35:47