gpt4 book ai didi

c# - 何时使用 TaskEx.Run 与 TaskEx.RunEx

转载 作者:太空狗 更新时间:2023-10-29 18:18:59 30 4
gpt4 key购买 nike

我正在尝试了解何时使用 TaskEx.Run。我提供了我在下面编写的两个代码示例,它们产生了相同的结果。我看不到的是为什么我会采用 Task.RunEx 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.Run

当您想在线程池上下文中运行异步代码时,请使用 TaskEx.RunEx

Stephen Toub 有两篇与行为差异相关的博文:

这只是您对 creating tasks 的几个选项之一.如果您不必使用 Run/RunEx,那么您不应该使用。使用简单的 async 方法,如果您需要在后台运行某些内容,则仅使用 Run/RunEx

关于c# - 何时使用 TaskEx.Run 与 TaskEx.RunEx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9334818/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com