我目前正在开发一个小型服务器应用程序,并学习任务<>和其他相关操作。
我想知道在任务中如何使用阻塞操作。
例如,我目前使用了几个具有“阻塞”操作的库。其中之一是Npgsql(PostgreSQL提供程序)。
如果我执行以下操作...
Task myTask = new Task<>( () =>
{
using(var db = new PostgresqlDatabaseConnection())
{
db.ExecuteQuery("SELECT takes 50 ms to get data...")
db.Insert(anObject); etc....
}
}
).Start();
请将其与处理该数据的其他任务链接在一起。
这样有效吗? 比如说,ExecuteQuery调用某种Thread.Sleep(1)或以某种方式阻塞线程,这会影响我的任务执行吗?
我问这个问题是因为我的服务器使用了几个库,必须重新编写以适应完全异步的方法。 或者这已经足够异步了吗?
*我的想法 *
我真的不确定。
我知道,例如,如果db.Executre()只运行while(true)循环直到获取数据,它几乎肯定会阻塞我的服务器。因为大量时间将花费在while(true)上进行处理。或者Task是否足够聪明,知道它应该在此花费更少的时间?或者如果它在内部使用某种等待机制,Task库是否知道?它是否知道它应该在等待时处理其他任务。
ContinueWith
将它们链接在一起吗?如果是这样,那么第二个任务直到第一个任务完成后才会执行。重新阅读后,我猜你是指ContinueWith
,因为你说后续任务依赖于那些数据。此外,就效率而言,如果任务2需要任务1的数据,任务3需要任务2,则即使第一个任务休眠,你也必须按顺序执行它们。除非有独立运行的部分,否则不要认为你可以获得任何效率提升。 - pstrjds