언제 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();
}
}
내가 동일한 결과를 얻을 수 있습니다 like
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 기능에 포함될 수없는 변경 사항과 관련이 있지만 최종 릴리스에는 적절하게 통합됩니다. –
변경된 작업 .RunEx' to'TaskEx.RunEx' 비동기 CTP'Task' 클래스에는'Run()'도'RunEx()'도 없습니다. 그들은 둘 다'TaskEx'에 있습니다. 내가 틀렸을 때 나를 바로 잡으십시오. –