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,查看更多内容
随时随地看视频慕课网APP