c# - 当您使用 async-await 时,我在何处定义任务以及在何处等待它是否重要?

标签 c# .net asynchronous async-await

我在看示例方法

public async Task MyMethodAsync()
{
    Task<int> longRunningTask = LongRunningOperationAsync();
    // independent work which doesn't need the result of LongRunningOperationAsync can be done here

    //and now we call await on the task 
    int result = await longRunningTask;
    //use the result 
    Console.WriteLine(result);
}

来自 How and When to use `async` and `await`我对它的工作原理有疑问。

所以假设我在它说我可以的地方添加了一些“独立工作”。

public async Task MyMethodAsync()
{
    Task<int> longRunningTask = LongRunningOperationAsync();
    int millionthPrimeNumber = GetMillionthPrimeNumber();
    int result = await longRunningTask;
    //use the result 
    Console.WriteLine(result % millionthPrimeNumber);
}

获得第 100 万个素数是独立的工作,所以我希望它是夹在 Task<int> longRunningTask = LongRunningOperationAsync(); 之间的那种东西和 int result = await longRunningTask;

然而,我很好奇的是我是否可以只写

public async Task MyMethodAsync()
{
    int result = await LongRunningOperationAsync();
    int millionthPrimeNumber = GetMillionthPrimeNumber();       
    //use the result 
    Console.WriteLine(result % millionthPrimeNumber);
}

这是否等价?或者 Task<int> longRunningTask = LongRunningOperationAsync();int result = await longRunningTask;实际上作为标志,以便可以完成的独立工作是他们之间的任何事情?

最佳答案

很多人误解了这一点。

首先:await 不启动任务。调用任务返回方法启动任务。 Await 不会导致同步的方法神奇地变成异步的。

那么 await 做了什么?等待意味着此点之后的内容将在任务完成后的某个时间运行。就是这样。这就是它的意思。为此,它异步等待 任务完成。 “异步等待”是指“返回调用者,以便在我们等待时可以完成更多工作”。

如果任务产生一个值,则 await 将从已完成的任务中提取值。这是完全一致的:如果后面的代码取决于任务的值(value),那么它也取决于正在完成的任务!

您应该在您的代码中在后面的代码取决于等待的任务是否已完成的地方放置

would that be equivalent or not?

它们是等价的,因为它们最终都会产生相同的结果。它们在表示不同的异步工作流的意义上并不等同。

关于c# - 当您使用 async-await 时,我在何处定义任务以及在何处等待它是否重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41092977/

相关文章:

c# - 从 C# 中的 MIDI 端口获取信号

c# - 如何通过代码确定硬件虚拟化是否可用? (C#, C++)

C# 交互式与立即窗口。差异、目的和用例

.net - 从某些客户端使用 MySqlConnection (.NET) 以 SSL 连接到 MySql-server 失败

.net - 使用 asp.net mvc 4 的简单注入(inject)器,从另一个程序集加载 Controller

c# - 如何将 `null` 转换为可空 int?我总是得到0

c# - 异步运行同步方法的正确方法是什么

java - 如何在单元测试中测试异步操作内的方法调用