多线程最佳实践

时间:2011-03-22 05:50:35

标签: .net multithreading

我正在写dll,它做了一些不同寻常的事情。 例如,数据库的一些操作。 例如:

(new Action(()=>
    {
    // database blablabla
    }
)).BeginInvoke((x)=>{}
              ,null);

我知道,关于threadqueue,关于backgroundworkers,关于Thread类等。 我的问题:最好的方法是什么?我做得对吗? 它会在以后引起任何麻烦吗?

2 个答案:

答案 0 :(得分:1)

如果您使用代理BeginInvoke,则您有责任确保EndInvoke被调用。我怀疑ThreadPool(或自定义工作队列/工作线程)是个更好的主意。

需要注意的另一件事是调用上下文;您将无法再访问有关请求的任何内容,因此必须提前捕获任何信息(例如,网站,如果进行多方租用)。

小心的线程安全显然是一个问题,但如果没有具体的例子,就无法给出具体的警告。

最后;小心数据库连接;连接不是线程安全的,因此您可能希望确保在工作者中有隔离的连接,因为您无法预测调用上下文中的任何连接正在执行的操作;它可以被处理,或者可能忙着做某事。不要使用它。

答案 1 :(得分:0)

我有an article on my blog讨论了异步/后台任务的几种方法的相对优点。异步委托是非常低级的。

我建议您使用基于Task的方法。这不仅对错误处理和返回值等方面提供了最好的支持,而且还为async CTP成为主流时的未来成功奠定了基础。如果您有时间,请阅读Task-Based Asynchronous Pattern文档 - 它描述了一些仍在开发的内容,但对如何设计基于Task的API提供了很好的说明。

还要记住Marc关于数据库连接和线程安全的警告。您可以使用parallel extensions samples中的任务计划程序正确访问数据库连接,同时保留基于Task的API。