c# - TAP的多任务处理

标签 c# .net multithreading asynchronous async-await

所以我得到了一个像这样的TAP

private async void btn_Start_Click(object sender, EventArgs e)
{
    var progress = new Progress<string>(s => textBox1.Text += s);
    await Task.Factory.StartNew(() => WebHelper.GetPosts(progress,cities[cityidx].link,categories[categoryidx].link,GetCurrentDistrict()),
                                TaskCreationOptions.LongRunning);
    label1.Text = "completed";
}
现在,如果我想一次执行多个任务,应该将代码放入for循环中吗?或者,还有更好的方法?

最佳答案

实际上,我的第一个建议是使用 Task.Run 而不是 Task.Factory.StartNew ,因为它是较新的版本,并且包含更多的recommended,尽管StartNew具有更多配置选项。
接下来,您只需调用 Task.WhenAll 来释放前台线程,即可完成所有任务:

var tasks = new List<Task>();
for (int i = 0; i < 10; i++)
{
    int ind = i; // copy trick to not get always 10 as output
    tasks.Add(Task.Run(() =>
    {
        Console.WriteLine(ind);
    }));
}

await Task.WhenAll(tasks);

正如@PeterBons明智地注意到的那样,一旦单击按钮,请考虑禁用(或忽略通过诸如IsProcessing之类的状态变量继续执行的逻辑),直到操作完成以逃避多次用户单击为止。

关于c# - TAP的多任务处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63576578/

相关文章:

c# - 有没有一种方法可以使用 Visual Studio 2022 在编译时通过转换检查在 C# 中创建自定义整数类型?

.net - 如果我已经安装了 .NET 4.0,还可以安装 .NET 3.5 吗?

python - 让我的代码处理需要很长时间才能完成的后台函数调用

c# - 在 ASP.NET Core 1.1 中使用 Webpack

c# - 为动画目的简化对对象成员的引用的创建?

.net - 如何管理构建服务器上自动构建的依赖项?

c++ - 如何使用新的 C++17 执行策略?

multithreading - 在单个核心 Azure 辅助角色上使用多个线程的原因

c# - 如何在datagridview中捕获删除行(从键盘)?

c# - DateTime.TryParseExact() 无法识别 PM 指示符,AM 按预期工作