winform多线程牛人进.....
为什么要加上tr.SetApartmentState(ApartmentState.STA);这句。否则会报下面那个错!
请详细回答!
using System;using System.Windows.Forms;using System.Threading;namespace WindowsFormsApplication4{ public partial class Form1 : Form { public Form1() { InitializeComponent(); this.Load += new EventHandler(Form1_Load); } private Thread tr; void Form1_Load(object sender, EventArgs e) { tr = new Thread(new ThreadStart(Do)); tr.SetApartmentState(ApartmentState.STA); tr.IsBackground = true; tr.Start(); } private void Do() { System.Windows.Forms.SaveFileDialog s = new SaveFileDialog(); if (s.ShowDialog() == System.Windows.Forms.DialogResult.OK) { MessageBox.Show("123"); } //在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。 //请确保您的 Main 函数带有 STAThreadAttribute 标记。 只有将调试器附加到该进程才会引发此异常。 } }}
回首忆惘然
浏览 735回答 22
22回答
-
12345678_0001
多线程访问了控件就会出现这个问题,
请使用BeginInvoke或Invoke方法
-
30秒到达战场
你换成System.Windows.Forms.TextBox t = new TextBox();就不会啦。。根本性不是这个原因...
-
素胚勾勒不出你
这是你所要访问的第三方组件就是“单线程单元模型”。所以你访问他你的线程也应该是单线程单元模式
-
红颜莎娜
能否说详细点
System.Windows.Forms.SaveFileDialog s = new SaveFileDialog();这个控件是系统自带的。不是第三方哦。。。
-
ibeautiful
@滴答的雨: 用reflector看内部代码是??这句话什么意思?怎么操作。。??
-
墨色风雨
@KeVinDurant: reflector.exe可以看到.NET封装的一些底层代码
-
慕运维8079593
@滴答的雨: 调用Win32内部方法,该方法肯定访问了现成的OLE组件,且这个组件是以SAT模型公开的...
这句怎么解释。。从哪里可以看出来?
-
慕姐8265434
@KeVinDurant: 推测。因为这种对话框本身就可能是之前留下来的组件啊,不会说每个组件都C#重新开发一次。喜欢研究的话把clr源码下下来研究下
-
largeQ
@滴答的雨: 怎么看出来是不是用c#开发的...还是用的其它组件??怎么查看?
-
料青山看我应如是
@KeVinDurant: reflector.exe能看到的就是C#开发的,当你发现这工具看不到的函数就是其他语言开发的
打开App,查看更多内容