今天一个客户反映上传文件程序卡死了,系统上传文件这么稳定的功能怎么可能有这个问题!现场一看果真如此,遂到本机测试,还真是这样。无语......

经过跟踪是在打开OpenFileDialog时导致,由于此表单打开是调用另一个入口进入的,在打开后记录下日志发现:线程号是独立的。由此可以判断打开表单的是新线程。跟踪代码发现是使用BackgroundWorker类进行操作的。那么是不是线程调用OpenFileDialog有限制呢?

经过一番搜索果真如此,调用时需要设置线程的ApartmentState属性为STA。错误信息如下所示:

 

在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。 只有将调试器附加到该进程才会引发此异常。

 

那么问题的原因定位到了,我采用的是新开一个线程调用上传方法,并将新开的线程的ApartmentState属性设置为STA:

 

        Thread thread = new Thread(new ThreadStart(UploadAffix));
        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();

 

标红的语句是关键点。经过新开的线程调用问题不仅解决了,而且采用新线程界面操作比较流畅了,对线程的理解不够深入也让用线程的方式解决变得比较激进了。

 

 

参考:C# 多线程中OpenFileDialog和SaveFileDialog失效的解决方法

http://www.360doc.com/content/14/0210/16/12338415_351392547.shtml