【问题标题】:Does calling await on a no task creation method do anything Asynchronous?在无任务创建方法上调用 await 会做任何异步操作吗?
【发布时间】:2017-12-04 23:05:41
【问题描述】:

考虑以下几点:

public async Task<bool> DoSomethingAsync()
{
  // no creation of a task in these statements
  statement2;
  statement3;
  statement4;
  return Task.FromResult( true );
}

public async Task MyMethod()
{
  statement1;
  await DoSomethingAsync().ConfigureAwait( false );
  statement5;
}

等待DoSomethingAsync时是否有任何异步行为要运行?

【问题讨论】:

  • 什么叫“异步行为”?答案可能是“否”,但不清楚您在问什么。
  • 在线程中执行的 statement5 是否与执行 statment1 的不同
  • 不,同一个线程。但即使该方法是异步的,也不意味着它将在不同的线程中执行。异步和并行是不同的事情。 You may want to check this article.
  • 我想他是想问,如果你要等待它,使用 async 可能有什么好处

标签: c# async-await


【解决方案1】:

等待DoSomethingAsync时是否有任何异步行为要运行?

不,没有。当DoSomthingAsync 被调用时,它会被整个执行并返回Task 已经完成。因此,当 await 尝试连接回调逻辑时,它会发现任务已经完成并继续执行而无需打扰回调逻辑。

但所有这些都是实现细节,这些细节可能会改变。您不应该假设此代码将同步运行来构建您的代码。在 DoSomthingAsync 中添加任何 await 都会使代码完全异步,而您不会注意到。

此外,DoSomthingAsync 现在的方式无法编译。您可以删除async,在这种情况下很明显DoSomthingAsync 不是异步的。或者你只有 return true; ,在这种情况下编译器应该警告你方法不包含任何 await 并且将同​​步完成。

在评论中考虑您的问题:

public async Task<bool> DoSomethingAsync()
{
  statement2;
  await statement3; // << Diverges here
  statement4;
  return true;
}

// all code below this line is completely irrelevant 
// to whenever or where the code above diverges

public async Task MyMethod()
{
  statement1;
  await DoSomethingAsync().ConfigureAwait( false );
  statement5;
}

【讨论】:

  • “但所有这些都是实现细节,这些细节可能会改变。”嗯,不完全是。 C# 规范(例如 C# 5 规范的第 7.7.7.2 节)保证任务已经完成时的行为。
  • 假设 DoSomethingAsync 中的语句也引入了 await 调用,但是在这些 await 层次调用中根本没有 Task.Run(...) 或任何其他任务创建机制,所以 awaits 将永远隐式地创建一个任务?
  • @muaz 在这种情况下,代码将以异步方式运行。它将使用当前当前的任何 TaskScheduler。
  • @muaz 如果DoSomethingAsync 等待其他一些任务,那么DoSomethingAsync 是否实际上是异步的取决于它等待的任务做什么,就像MyMethod 的行为取决于@987654335 @ 做。如果您await 的其他任务确实异步运行,那么DoSomethingAsync 将是异步的,但如果它是已经完成的Task,那么DoSomethingAsync 将同步运行。
  • @muaz await 不会创建 Task。将方法标记为async 会导致该方法创建一个新任务并返回该新任务。 Task 的行为取决于方法的主体,包括返回的任务何时完成。
猜你喜欢
  • 2017-12-16
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
相关资源
最近更新 更多