内容简介:这篇文章主要为大家详细介绍了.NET中OpenFileDialog使用线程报错的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
昨天,在做一个NPOI读取的小demo的时候,使用OpenFileDialog打开文件,最开始的写法,直接在按钮点击事件中写,会报错,代码如下:
OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "Microsoft Office Excel(*.xls;*.xlsx)|*.xls;*.xlsx"; ofd.FilterIndex = 1; ofd.RestoreDirectory = true; if (ofd.ShowDialog() == DialogResult.OK) { //检测打开文件路径是否为空地址 if (!string.IsNullOrEmpty(ofd.FileName)) { ReadFromExcelFile(ofd.FileName); } else { this.textBox1.Text = "请打开excel文件"; } }
或者直接
using(OpenFileDialog ofd = new OpenFileDialog()){ ofd.ShowDialog(); }
这两种,无论哪种写法,在代码执行的时候,会报错,具体报错为:
“System.Threading.ThreadStateException”类型的未经处理的异常在 System.Windows.Forms.dll 中发生
其他信息: 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。 只有将调试器附加到该进程才会引发此异常。
这种情况,在网上查询,是说线程问题,就是线程冲突了,不知道该执行哪一个,具体说法如下:
COM提供的线程模型共有三种:Single-Threaded Apartment(STA 单线程套间)、Multithreaded Apartment(MTA 多线程套间)和Neutral Apartment/Thread Neutral Apartment/Neutral Threaded Apartment(NA/TNA/NTA 中立线程套间,由COM+提供)。
STA 一个对象只能由一个线程访问,相当于windows的消息循环,实现方式也是通过消息循环的,ActiveX控件、OLE文档服务器等有界面的,都使用STA的套间。 MTA 一个对象可以被多个线程访问,即这个对象的代码在自己的方法中实现了线程保护,保证可以正确改变自己的状态。
所以创建和访问一个activex或者ole对象时,必须设置线程模式为sta。
那么,在子线程中应该如何使用OpenFileDialog才不会继续报这种错误呢,下面就是更改后的代码:
/// <summary> /// 单线程打开excel文档 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnXlx_Click(object sender, EventArgs e) { this.textBox1.Text = string.Empty; System.Threading.Thread s = new System.Threading.Thread(new System.Threading.ThreadStart(getExcel)); s.ApartmentState = System.Threading.ApartmentState.STA; s.Start(); } /// <summary> /// 读取excel文档地址 /// </summary> private void getExcel() { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "Microsoft Office Excel(*.xls;*.xlsx)|*.xls;*.xlsx"; ofd.FilterIndex = 1; ofd.RestoreDirectory = true; if (ofd.ShowDialog() == DialogResult.OK) { //检测打开文件路径是否为空地址 if (!string.IsNullOrEmpty(ofd.FileName)) { ReadFromExcelFile(ofd.FileName); } else { this.textBox1.Text = "请打开excel文件"; } } }
就是把线程执行的内容,单独分离出来形成一个方法,然后在事件中编写执行子线程单线程执行语句,这种情况下,就不会在报那种线程异常的错误了。
PS:个人通过搜索网上内容,总结出来的,感觉的可以成解决的一个方法,向其他诸如Main函数前门加[STAThread],还有其他的一些办法,并没有解决掉问题。个人的方法或许在大神看来有些麻烦,如果大神有更好的方法,那么会十分感谢以及欢迎分享在此!
以上所述就是小编给大家介绍的《.NET中OpenFileDialog使用线程报错的解决方法》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 客户端多线程编程解决思路
- 【开发小记】 Java 线程池 之 被“吃掉”的线程异常(附源码分析和解决方法)
- Transmittable-Thread-Local:阿里开源的线程间上下文传递解决方案
- java中线程安全,线程死锁,线程通信快速入门
- ObjC 多线程简析(一)-多线程简述和线程锁的基本应用
- Java多线程之线程中止
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Persuasive Technology
B.J. Fogg / Morgan Kaufmann / 2002-12 / USD 39.95
Can computers change what you think and do? Can they motivate you to stop smoking, persuade you to buy insurance, or convince you to join the Army? "Yes, they can," says Dr. B.J. Fogg, directo......一起来看看 《Persuasive Technology》 这本书的介绍吧!