【问题标题】:What if there is no thread for call back of asynchronous function如果没有线程回调异步函数怎么办
【发布时间】:2020-02-08 20:50:42
【问题描述】:

我认为,当我们发出异步请求时,线程池中的一个线程将被分配给该请求,当该请求作为 sql 查询进入数据库时​​,直到查询完成,分配给该请求的线程将被释放然后另一个请求可以使用该线程。

所以我的问题是让我们考虑一下所有线程都已分配给请求并且线程池中没有线程的情况。然后想象一下触发了一个sql查询的回调,以及由于线程池中没有空闲线程,CPU如何处理这个回调。

【问题讨论】:

  • 如果超过ThreadPool.GetMaxThreads() 返回的限制,则代码将阻塞,直到另一个线程可用,这是一件坏事。但是,在许多情况下,它不需要创建线程(根据 MickyD 链接的文章)。
  • .NET 有单独的线程池用于 I/O 回调操作(有时称为 I/O 线程池),因此服务于输入请求的工作线程池的耗尽可能有只是对 I/O 线程池的间接影响,这意味着更多的输入请求将导致更多的 I/O 回调。因此,在工作线程池耗尽的情况下,I/O 回调会发生什么主要取决于是否使用了将执行分派给工作线程的同步上下文(它将在前一种情况下等待线程或将后者立即执行)。

标签: c# .net multithreading asynchronous threadpool


【解决方案1】:

通常,处理器管理线程的堆栈,但是如果您在编程级别开始抛出线程而没有任何控制,它可能会阻塞开发人员,实际上是应用程序,最大线程数由物理量决定可用资源。

ThreadPool.GetAvailalbeThreads 返回池中当前可用的线程数。它是最大线程数减去当前活动线程数。

ThreadPool.GetAvailableThreads(out workers, out ports); 

【讨论】:

    猜你喜欢
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多