- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个做两件事的 TPL 任务。首先,它调用网络服务。其次,它将一些数据插入数据库。我有多达 20 个任务同时开始,一遍又一遍地做同样的事情。他们整天所做的就是调用 Web 服务并将数据插入数据库。
我对 .NET 中的 TPL 还很陌生。我已经完成了一些有关后台工作进程和异步 Web 服务的工作。
Web 服务调用和数据库插入都是任务运行线程内的阻塞调用。
我知道在幕后,当您使用 Tasks 时,.NET 会为您管理一个线程池。是吗?
如果我使用 async 和 await() 进行服务调用和数据库调用而不是使它们阻塞调用,线程池是否会有更多线程供其使用?
我的理论(我不确定我为什么这么认为)是线程在等待阻塞的 Web 服务时正忙于无所事事,无法暂时将其资源返回到池中。但我想知道任务是否正在等待异步调用完成,主任务线程是否能够在等待时切换到让其他东西处理。
我的理论对吗?还是我在编造东西?
我使用的是 c# 和 .NET 4.0,但如果需要我可以升级到 4.5。
最佳答案
Would the thread pool have more threads at its disposal if I made the service call and database call with async and await() instead of making them blocking calls?
这取决于您所说的“使用异步等待”是什么意思。
当您使用 Task.Run
时,在后台,Task
类使用 ThreadPool
使用 ThreadPool 卸载工作
线程。
如果您的服务没有公开真正的异步 api 并且您使用 Task.Run
来排队您的工作,您仍然会阻塞线程池线程来执行 IO 绑定(bind)工作,无论使用异步等待
。在您的问题中,您声明这两个调用都是阻塞调用,在这种情况下,答案是否定的,用于进行这些阻塞调用的线程池线程仍将被阻塞。
如果您的服务和数据库调用是真正的异步 API(不消耗任何额外线程来完成其工作的 API),您可以利用 async-await
,就像您 await
在其中一个调用上(并且您根本不需要对它们使用 Task.Run),当前线程会将控制权交还给调用者,同时可以用来做更多的工作.如果是这种情况,那么是的。
My theory (and I'm not sure why I think this) is that the thread is busy doing nothing while waiting on the blocking web service and can't return its resources temporarily to the pool. But I wonder if the Tasks were waiting for async calls to finish whether the main Task thread would be able to switch to let other stuff process while waiting.
你的理论是正确的。如果排队线程池的主要工作是发出 IO 绑定(bind)请求,那么它花费的大部分时间只是阻塞,直到请求完成。
当您await
Task
时,控制权返回给调用者。假设您的服务调用是 REST 调用,您可以使用 HttpClient
公开真正的非线程消耗异步方法,例如 GetAsync
、PostAsync
、当您 await
这些调用时,您的调用线程将被释放以同时执行更多工作。
关于c# - 如果线程正在等待异步操作完成,.NET Task 线程的资源是否会暂时返回池中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25322863/
我试图让脚本暂停大约 1 秒,然后继续执行脚本,但我似乎无法弄清楚如何做。这是我的代码: function hello() { alert("Hi!") //I need about a 1
wait() 和 wait(timeout) 之间有什么区别。无论如何 wait() 需要等待通知调用,但为什么我们有 wait(timeout)? 那么 sleep(timeout) 和 wait(
我需要做什么: 我有一个带有文件输入和隐藏文本输入的上传表单。用户上传图像,图像被操作,然后发送到远程服务器进行处理,这需要几秒钟,然后远程服务器将最终的图像发送回家庭服务器,并保存在新文件夹中。 J
大家好,我正在使用 Visual C++ 2010,尝试使用 Winsock 编写服务器/客户端应用程序...我不确定为什么,但有时服务器会在 listen() 函数处等待,有时会在 accept 处
任务描述 我为我的 Angular 应用程序实现了 CRSF 保护。服务器检查 crsf token 是否位于请求的 header “X-CSRF-TOKEN”中。如果不是,它会发送一个 HTTP 响
我想做这个例子https://stackoverflow.com/a/33585993/1973680同步。 这是正确的实现方式吗? let times= async (n,f)=>{
我如何将 while 循环延迟到 1 秒间隔,而不会将其运行的整个代码/计算机的速度减慢到一秒延迟(只是一个小循环)。 最佳答案 Thread.sleep(1000); // do nothing f
我知道这是一个重复的问题。但是我无法通过解释来理解。我想用一个很好的例子来清楚地理解它。任何人都可以帮忙吗。 “为什么我们从同步上下文中调用 wait()、notify() 方法”。 最佳答案 当我们
我有一个 click 事件,该事件是第一次从另一个地方自动触发的。我的问题是它运行得太快,因为所需的变量仍在由 Flash 和 Web 服务定义。所以现在我有: (function ($) {
我有如下功能 function async populateInventories(custID){ this.inventories = await this.inventoryServic
我一直对“然后”不被等待的行为感到困扰,我明白其原因。然而,我仍然需要绕过它。这是我的用例。 doWork(family) { return doWork1(family)
我想我理解异步背后的想法,返回一个Future,但是我不清楚异步在一个非常基本的层面上如何表现。据我了解,它不会自动在程序中创建异步行为。例如: import 'dart:async'; main()
我正在制作一个使用异步的Flutter应用程序,但它的工作方式不像我对它的了解。所以我对异步和在 Dart 中等待有一些疑问。这是一个例子: Future someFunction() async {
我在 main.tf 中创建资源组和 vNet,并在同一文件中引用模块。问题是,模块无法从模块访问这些资源。相关代码(删除了大部分代码,只留下相关部分): main.tf: module "worke
我的代码的问题是,当代码第一次运行时,我试图获取的 dom 元素并不总是存在,如果它不存在,那么永远不会做出 promise 。 我是否可以等到 promise 做出后再尝试实现它? 我希望我的最后一
所以,过去几天我一直在研究这段代码,并尝试实现回调/等待/任何需要的东西,但没有成功。 问题是,我如何等待响应,直到我得到两个函数的回调? (以及我将如何实现) 简而言之,我想做的是: POST 发生
谁能帮我理解这一点吗? 如果我们有一个类: public class Sample{ public synchronized method1(){ //Line1 .... wait();
这是我编写的代码,用于测试 wait() 和 notify() 的工作。现在我有很多疑问。 class A extends Thread { public void run() { try
我有以下代码由于语法错误而无法运行(在异步函数外等待) 如何使用 await 定义变量并将其导出? 当我这样定义一个变量并从其他文件导入它时,该变量是只创建一次(第一次读取文件时?)还是每次导入时都创
一个简单的线程程序,其中写入器将内容放入堆栈,读取器从堆栈中弹出。 java.util.Stack; import java.util.concurrent.ExecutorService; impo
我是一名优秀的程序员,十分优秀!