【发布时间】:2014-08-15 07:43:34
【问题描述】:
我有一个 TPL 任务,它做两件事。首先,它调用 Web 服务。其次,它将一些数据插入数据库。我有多达 20 个任务一次开始,一遍又一遍地做同样的事情。他们整天所做的就是调用 Web 服务并将数据插入数据库。
我对 .NET 中的 TPL 还很陌生。我用后台工作进程和异步 Web 服务做了一些事情。
Web 服务调用和数据库插入都是在任务运行的线程中的阻塞调用。
我知道,当您使用 Tasks 时,.NET 会在幕后为您管理一个线程池。是吗?
如果我使用 async 和 await() 进行服务调用和数据库调用而不是让它们阻塞调用,线程池是否会有更多线程可供使用?
我的理论(我不确定我为什么这么认为)是线程在等待阻塞的 Web 服务时忙于无所事事,并且无法暂时将其资源返回到池中。但我想知道任务是否正在等待异步调用完成主任务线程是否能够切换以让其他东西在等待时处理。
我的理论对吗?还是我在编造?
我正在使用 c# 和 .NET 4.0,但如果需要,我可以转到 4.5。
【问题讨论】:
-
你是对的,你当前的实现不是最优的(它可能已经足够好了,所以你只有在发现问题时才改变它)。但是,要回答您的第二个问题,您必须提供一个示例,您将如何在任务中使用异步。理论上线程会被返回到池中,但是有很多方法可以让它出错。
-
谢谢斯蒂尔加。我现在要去睡觉了。西雅图时间凌晨 1:00。但是我明天会发布更多代码,然后删除这条评论。
-
@Trevor:我认为要记住的关键是有两种任务。我称它们为 Promise Tasks 和 Delegate Tasks。只有委托任务会在线程上执行; Promise 任务只是一些未来事件的抽象表示。 TPL 几乎完全使用委托任务;
async/await几乎完全使用 Promise 任务。查看my blog post 了解更多信息。
标签: c# .net asynchronous task-parallel-library async-await