.net BITS(后台智能传输服务)必须使用STA吗?

.net BITS(后台智能传输服务)必须使用STA吗?,.net,winapi,com,microsoft-bits,.net,Winapi,Com,Microsoft Bits,我用的是锋利的钻头(http://sharpbits.codeplex.com/),一个运行良好的.NET位包装器。我不太确定,但估计BITS必须在单线程单元(STA)中运行。对于旧版本,我在多线程单元(MTA)中运行BITS时遇到一些问题,例如.NET控制台应用程序的默认设置。我在BITS文档或互联网上找不到任何与此相关的内容 甚至SharpBITS也尝试将BitsManager构造函数中的单元状态设置为STA(实际上只有在线程启动之前才可能) 有人知道比特是否真的必须在STA中运行吗?当前版

我用的是锋利的钻头(http://sharpbits.codeplex.com/),一个运行良好的.NET位包装器。我不太确定,但估计BITS必须在单线程单元(STA)中运行。对于旧版本,我在多线程单元(MTA)中运行BITS时遇到一些问题,例如.NET控制台应用程序的默认设置。我在BITS文档或互联网上找不到任何与此相关的内容

甚至SharpBITS也尝试将BitsManager构造函数中的单元状态设置为STA(实际上只有在线程启动之前才可能)


有人知道比特是否真的必须在STA中运行吗?当前版本似乎在MTA中运行良好。

否。BackgroundCopyManager coclass的各种版本在注册表中注册,ThreadingModel项设置为“两者”。这意味着您可以在MTA线程中创建一个线程(默认为您自己创建的任何线程或控制台应用程序的主线程),并且不会封送调用。如果在STA线程中创建一个,那么调用将被封送回该线程


是的,MTA会产生问题,因为现在由您来确保自己的代码是线程安全的。STA线程提供了很多保证,实际上借用了COM提供的线程安全性。如果MTA没有这样的保证,您必须确保您的代码像BITS一样是线程安全的。您将从BITS收到的通知将是典型的麻烦制造者,需要锁定以保护您自己的状态。

回答非常好。谢谢,汉斯。