快速触发任务方法
Trigger Task method rapidly
命令接收者:
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 个命令),我该如何处理而没有(或低)延迟,或者我该如何制作我的任务函数 (Task DoSomeThing();
) 运行 并行
我已经测试了我的代码,它工作正常。但如果有更好的方法,我希望得到您的建议。还是我遗漏了任何错误? (我没有用每秒多个命令测试它)。
正如其他人指出的那样,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.
}
命令接收者:
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 个命令),我该如何处理而没有(或低)延迟,或者我该如何制作我的任务函数 (Task DoSomeThing();
) 运行 并行
我已经测试了我的代码,它工作正常。但如果有更好的方法,我希望得到您的建议。还是我遗漏了任何错误? (我没有用每秒多个命令测试它)。
正如其他人指出的那样,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.
}