我正在写dll,它做了一些不同寻常的事情。 例如,数据库的一些操作。 例如:
(new Action(()=>
{
// database blablabla
}
)).BeginInvoke((x)=>{}
,null);
我知道,关于threadqueue,关于backgroundworkers,关于Thread类等。 我的问题:最好的方法是什么?我做得对吗? 它会在以后引起任何麻烦吗?
答案 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。