“真正的”异步的话题经常出现。我还经常听到在异步包装器中包装同步方法是不好的。让我有这个代码:
class Program
{
static string GetResult(int id)
{
// Очень долги, идущий в базу, синхронный, блокирующий метод
...
}
static async Task Main(string[] args)
{
var res = await Task.Run(() => GetResult(123));
}
}
为什么不好,我的意思是,将阻塞方法包装在 中await Task.Run(...)?你能简单地描述一下这个问题吗?我会很感激。
使用这种方法,一个线程将空闲等待来自数据库的响应。并不是说这个解决方案非常糟糕,但是在许多情况下,需要将此线程与其他一些工作一起使用。
例如:由于池中缺少空闲线程,高负载的服务不能很好地为客户端提供服务。
更正确的解决方案是重写 GetResult,使所有数据库操作都通过异步 API 进行。在这种情况下,线程只是向数据库发送一个查询并被释放。来自数据库的响应将在任何空闲线程中处理。
UPD:我强烈推荐阅读这个人的博客:Stephen Cleary - Async and Await。许多事情正在被澄清。具体相关链接: