gpt4 book ai didi

c# - 对于 C# 和 .NET,为什么运行时不自动异步运行?

转载 作者:太空宇宙 更新时间:2023-11-03 21:18:43 24 4
gpt4 key购买 nike

这是一个关于 .NET async/await 库的基本(阅读新手)问题,但我想在重写我们的 api 之前我无论如何都会问这个问题。

问题

为什么运行时不简单地评估任何有大量空闲时间的给定线程,并在它到达阻塞调用时自动异步操作。

一些例程的例子

  1. 对某些应用程序的 Web 请求...
  2. 应用开始数据库调用...
  3. 等待响应...(空闲且长时间)
  4. 接收记录集...
  5. 返回给客户...

如果我是运行时环境,简单地记下第 3 步需要一段时间不是明智的,所以我应该在此时使用当前线程,在它空闲的时候,来帮助其他例程,这些例程通常会正在等待我们当前的线程可用吗?

是否有可能在未来的某个时候我们能够在 app.config(或 web.config)中切换一个标记 <system.runtime><asyncBehavior enableAsynchronousWhenIdle=true /></system.runtime>

最佳答案

当然可以,但它完全打破了当前的编程模型。在您进行阻塞调用之前,您可以保证没有其他代码会在您的线程上运行。此更改现在允许在同一线程上进行重入调用。

例如考虑这种情况:

static int _processCount;
static object _lockObj = new object();

public Response ProcessRequest(Request request) {
lock (_lockObj) {
_processCount++;
var savedCount = _processCount;

// Make long running request

if (savedCount != _processCount)
throw new InvalidOperationException("Is my lock broken?");
}
}

在我们允许在长时间运行的过程中处理请求之前,这段代码很好,但是如果我们允许在线程发出长时间运行的请求时处理新请求,我们就打开了这种情况的可能性。

  1. 处理请求 A
  2. 处理请求 A 等待长时间运行的操作
  3. 空闲处理使用线程处理Request B。
  4. 请求B进入锁,因为锁有线程亲和性
  5. 请求 B 等待长时间运行的操作
  6. 请求 A 从长时间运行的操作返回并抛出异常,因为它的状态已损坏。

因此,需要以能够意识到重入可能性的方式编写代码。框架无法知道您的代码是否会中断,因此永远不会发生更改。

关于c# - 对于 C# 和 .NET,为什么运行时不自动异步运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32255730/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com