我正在使用SharpBITS(http://sharpbits.codeplex.com/),这是一个运行良好的BITS .NET包装器。我不太确定,但认为BITS必须在单线程公寓(STA)中运行。对于旧版本,我在多线程单元(MTA)中运行BITS时遇到了一些问题,例如默认情况下,这是.NET控制台应用程序。我在BITS文档或互联网上找不到任何相关内容。
甚至SharpBITS也试图将BitsManager的构造函数中的单元状态设置为STA(在线程启动之前实际上只能)。
有人知道BITS是否真的必须在STA中运行?好的版本似乎也在MTA中运行。
答案 0 :(得分:2)
没有。各种版本的BackgroundCopyManager coclass在注册表中注册,ThreadingModel键设置为“Both”。这意味着您可以在MTA线程中创建一个(默认为您自己创建的任何线程或控制台应用程序的主线程),并且不会调用调用。如果你在一个STA线程中创建一个,那么调用将被封送回该线程。
是的,MTA可能会产生问题,因为现在您需要确保自己的代码是线程安全的。您从STA线程获得了很多保证,实际上您借用了COM提供的线程安全性。没有MTA的这种保证,你必须确保你的代码与BITS一样是线程安全的。您从BITS获得的通知将是典型的麻烦制造者,需要锁定以保护您自己的状态。