Я пытаюсь понять, когда использовать 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, все это связано с изменениями, которые не могут быть включены в основные функции .NET для CTP, но будут правильно установлены для окончательной версии. –
Изменена 'Задача .RunEx' to 'TaskEx.RunEx' В классе Async CTP' Task' нет ни 'Run()', ни 'RunEx()'). Они оба находятся в 'TaskEx'. Исправьте меня, если я ошибаюсь –