【问题标题】:Trigger Task method rapidly快速触发任务方法
【发布时间】:2023-04-02 17:23:01
【问题描述】:

命令接收者:

public override async ValueTask Execute(){
    // my code here
    // this is boardcast command
    // attempt #1
    Parallel.ForEach(lists, async list => { await DoSomething(); });

    // attempt #2
    List<Task> tasks = new List<Task>();
    foreach(ulong id in ids) tasks.Add(DoSomething());
    await Task.WhenAll(tasks);
}

DoSomething():

public async Task DoSomething(){
    Task<abc> Request = API.RequestSomething();
    // attempt #1
    await Request.ContinueWith(Callback => {
        // Do something (long time...) , eg: update database, update all client data etc.
    });

    // attempt #2
    await Request.ContinueWith(Callback => {
        // .....
    }, TaskContinuationOptions.ExecuteSynchronously);
}

问题是:如果客户端快速向接收器发送命令(大约每秒 100 个命令),我怎样才能在没有(或低)延迟的情况下处理这个问题,或者我怎样才能使我的任务功能(@ 987654325@) 并行运行

我已经测试了我的代码,它运行良好。但如果有更好的方法,我希望得到您的建议。还是我遗漏了什么错误? (我没有用每秒多个命令对其进行测试)。

【问题讨论】:

  • "我已经测试了我的代码,它运行良好。" - 在这种情况下,一切都是过早的优化。
  • 请注意Parallel.ForEach is not async friendly。还将ContinueWithawait is not a good idea 结合起来,因为这两种机制完成了同样的事情。使用其中一种,最好使用await
  • 我尝试了很多方法,直到我尝试了这个方法,它才有效,但我不知道是否还有其他情况会导致我的代码无法正常工作。但感谢大家的快速回复和建议。

标签: c# multithreading async-await parallel-processing task-parallel-library


【解决方案1】:

正如其他人所指出的,Parallel 不应与 async 方法一起使用,因此 Task.WhenAll 方法是异步并发的正确解决方案:

public override async ValueTask Execute() {
  var tasks = ids.Select(id => DoSomething()).ToList();
  await Task.WhenAll(tasks);
}

关于您的实施,do not use ContinueWith:

public async Task DoSomething() {
  var Callback = await API.RequestSomething();
  // Do something (long time...) , eg: update database, update all client data etc.
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多