我仍然无法解决异步/等待问题。我试图弄清楚是否需要将 CPU 密集型工作负载包装在下面的 Task.Run 中。有人能告诉我哪种方法更好吗?
没有Task.Run:
public async Task ProcessData()
{
//Get some data
var httpClient = new HttpClient();
var response = await httpClient.GetAsync("myUrl");
string data = await response.Content.ReadAsStringAsync();
//Calculate result
string result = null;
for (int i = 0; i < 10000000; i++)
{
//Do some CPU intensive work
}
//Save results
using (var fs = new FileStream("myFile.txt", FileMode.Create))
using (var writer = new StreamWriter(fs))
{
await writer.WriteLineAsync(result);
}
}
使用Task.Run:
public async Task ProcessData()
{
//Get some data
var httpClient = new HttpClient();
var response = await httpClient.GetAsync("myUrl");
string data = await response.Content.ReadAsStringAsync();
//Calculate result
string result = null;
await Task.Run(() =>
{
for (int i = 0; i < 10000000; i++)
{
//Do some CPU intensive work
}
});
//Save results
using (var fs = new FileStream("myFile.txt", FileMode.Create))
using (var writer = new StreamWriter(fs))
{
await writer.WriteLineAsync(result);
}
}
我的直觉是不使用 Task.Run 但在这种情况下,这是否意味着异步方法中的所有代码都将在单独的线程上执行?意味着调用线程直到最后才会被中断(文件流关闭并且方法结束)?
或者调用者线程是否会被中断并返回此方法以首先执行 CPU 密集型部分,然后在 ProcessData() 为 FileStream 部分在后台运行时返回它正在执行的任何操作?
我希望这很清楚。
提前致谢