多线程最佳实践

3
我正在编写一个dll,它可以异步地执行一些操作,例如与数据库的交互。举个例子:
(new Action(()=>
    {
    // database blablabla
    }
)).BeginInvoke((x)=>{}
              ,null);

我知道,关于线程队列、后台工作者、Thread类等等。 我的问题是:最好的方法是什么?我做得对吗? 这会在未来引起任何麻烦吗?
2个回答

1
如果您使用委托的 BeginInvoke,您需要确保调用 EndInvoke。我建议使用 ThreadPool(或自定义工作队列/工作线程)会更好一些。
还有一点需要注意的是调用上下文; 您将不再能够访问关于请求的任何信息,因此任何信息(例如,如果进行多租户,则为站点)必须提前捕获。
当然需要注意仔细的线程安全问题,但无法在没有具体示例的情况下给出特定的警告。
最后,要小心数据库连接;连接不是线程安全的,因此您可能需要确保在您的工作程序中有一个隔离的连接,因为您无法预测调用上下文中的任何连接正在做什么;它可能被释放了,或者可能正在忙于某些操作。不要使用它。

0

我有一篇关于异步/后台任务几种方法相对优劣的博客文章。异步委托是相当低级别的。

我建议您使用一种基于Task的方法。这不仅对像错误处理和返回值这样的方面具有最好的支持,而且在async CTP成为主流时还会使您取得未来的成功。如果您有时间,请阅读基于任务的异步模式文档-它描述了一些尚在开发中的东西,但对如何设计基于Task的API提供了极佳的说明。

还要记住Marc关于数据库连接和线程安全的警告。您可以使用并行扩展示例中的任务调度程序来正确访问数据库连接,并保持基于Task的API。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接