【发布时间】:2019-07-23 02:24:17
【问题描述】:
我需要知道这三种使用 TPL 启动任务的方式之间的区别:
Task.Run(() => _client.RunClient());
对比
Task.Run(_client.RunClient);
对比
Task.Run(async () => await _client.RunClient());
假设我有以下类结构:
public class Controller {
private _client = new Client();
...
public async Task StartClientA() {
await Task.Run(_client.RunClient);
}
public async Task StartClientB() {
await Task.Run(() => _client.RunClient());
}
public async Task StartClientC() {
await Task.Run(async () => await _client.RunClient());
}
}
那么,在客户端,下面是 StartClientA、StartClientB 和 StartClientC 的方法签名:
public async Task StartClientA() {
...
}
public async Task StartClientB() {
...
}
public async Task StartClientC() {
...
}
现在,我在这些方法中调用 RunClient 的方式有什么区别?
让我感到困惑的是后面的代码会发生什么:
await Task.Run(...)
Task.Run 是否立即返回,并且函数继续执行?还是仅在方法 _client.RunClient 完成时才完成 Task.Run?什么是 _client.RunClient 在一个 while(true) 循环中并且从不退出?这对这些启动线程的方法有何影响?
围绕这些不同的任务调用方式的最佳实践是什么?我要等待 lambda 吗?我要等待 Task.Run 吗?我不等待_client.RunClient 吗?
对于一篇帖子中的所有问题,我们深表歉意。我试图了解这些不同的行为,以便我可以选择最有意义的一种。我读过很多关于 async/await 的文章,这是一个我似乎找不到答案的问题。
提前感谢您的帮助。
【问题讨论】:
标签: .net asynchronous lambda async-await task-parallel-library