【问题标题】:why .net framework won't do async automatically为什么 .net 框架不会自动执行异步操作
【发布时间】:2019-11-06 21:38:33
【问题描述】:

也许我在这里遗漏了一些明显的东西。因此,在 C# 中,我们在 IO 操作中使用了 async/await 功能,以便在等待 IO 完成时释放线程。

问题是为什么我们必须这样做,为什么框架不能自动这样做?

编辑 简而言之,我们称之为很酷的东西

var a = File.ReadAllText

它的工作原理就像我们调用

var a = await File.ReadAllTextAsync

因为 .net 框架将负责异步调用所有 IO 操作(它作为同步代码从用户代码接收)。

【问题讨论】:

  • 请显示一些具体代码以帮助我们了解您的想法,或者添加更多详细信息,您的要求还不清楚。
  • 您可能不想异步执行操作。
  • @Jeroen Mostert 为什么我必须放置 async/await?
  • 因为同步代码更容易编写、编译和理解,这就是为什么默认情况下,您编写的所有内容都是同步执行的。构建一种语言和框架是可能的,其中一切都普遍异步,线程不存在并且您不需要关键字 - 但 .NET 不是这样的框架,C# 不是这样的语言。跨度>
  • 您不必等待每个异步调用。

标签: c# asynchronous async-await


【解决方案1】:

如果这两行是等价的:

string s = await File.ReadAllTextAsync(); // Current syntax

string s = File.ReadAllText(); // Proposed syntax

...那么我们将无法在不立即等待的情况下创建Task。所以我们不能使用Task.WhenAllTask.WhenAny 等允许并发的所有这些很酷的员工。然后我们需要一个不同的关键字来表示非等待,如下所示:

var s = defer File.ReadAllText(); // s is Task<string>

或者通过返回变量的类型来推断:

Task<string> s = File.ReadAllText(); // defer is inferred

任何包含string s = File.ReadAllText(); 行的方法现在都将隐式异步,因此它应该返回Task。为了保持一致性,并使开发人员更容易,它可能应该允许在签名中保留未包装的类型。等效的当前和建议语法示例:

public async Task<string> GetData() => await File.ReadAllTextAsync(); // Current syntax

public string GetData() => File.ReadAllText(); // Proposed syntax

我不确定你能在这个实验中走多远。我想如果 async/await 与 TPL 库一起被引入,你可能会在遇到障碍之前走几英里。但由于 TPL (2010) 早于 async/await (2012),已经有很多 API 暴露了 Task 类型,并且已经有很多使用这些 API 的代码会被新语法破坏。

【讨论】:

  • 这个实验的主要问题是它只会使所有现有代码在二进制级别上不兼容。你所有的新代码都会突然变成async,如果不重新编译,现有代码都无法调用它。对于任何明智的语言设计者来说,在如此大规模的层面上打破生态系统都不是一件容易的事,无论异步支持多么酷——并且通过让运行时“静默”地在边界处注入同步等待来解决这个问题。通过异步同步的蠕虫。这将是一个新的语言时期。
  • 我认为@Jeroen Mostert 是对的,这只是一个突破性的变化,所以他们决定了他们的决定
  • @ren 原因不在于这将是一个突破性的变化。这是两者都有用例。有时您实际上可能希望某些东西同步运行并且需要依赖该行为。
  • @GabrielLuci 这是一个很好的论点。几乎是表演的终结者。我想不出办法解决这个问题,这不会破坏旧代码。
  • 那些聪明的家伙还没有弄清楚如何自动确定.ConfigureAwait(false).ConfigureAwait(true) 是否在所有情况下都是合适的(因为这取决于您的同步代码是否是线程-仿射与否)所以我不会那么乐观。 :-P 是的,这是一个有趣的思想实验,看看它需要付出多少努力才能对此概念进行工作证明,但同时希望很明显为什么他们没有将其作为初始实现. async / await 有足够的魔力。
猜你喜欢
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
  • 1970-01-01
相关资源
最近更新 更多