【问题标题】:Multi Tasking With TAP使用 TAP 进行多任务处理
【发布时间】:2020-09-10 17:15:30
【问题描述】:

所以我得到了这样的 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 循环中吗?还是有更好的方法?

【问题讨论】:

  • 您可以启动多个任务,而不是立即将它们放在一个列表中等待它们。然后做await Task.WhenAll(tasks.ToArray());
  • 旁注:您可能希望在等待时禁用该按钮,以避免在用户双击时启动新任务。
  • 您不应将Task.Factory.StartNewasync-await 一起使用。

标签: c# .net multithreading asynchronous async-await


【解决方案1】:

实际上,我在这里的第一个建议是使用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 之类的状态变量继续执行的逻辑),直到操作完成以逃避多次用户单击。

【讨论】:

    猜你喜欢
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多