为了账号安全,请及时绑定邮箱和手机立即绑定

winform多线程牛人进.....

winform多线程牛人进.....

回首忆惘然 2018-12-06 12:49:30
为什么要加上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 标记。 只有将调试器附加到该进程才会引发此异常。        }    }}
查看完整描述

22 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

@KeVinDurant: reflector.exe能看到的就是C#开发的,当你发现这工具看不到的函数就是其他语言开发的
查看完整回答
反对 回复 2018-12-09
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

@滴答的雨: 看到了。调用了外部函数。。怎么跟调用win32 api不同的。。??没有看到引入命名空间什么之类的???
查看完整回答
反对 回复 2018-12-09
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

@KeVinDurant:  [SecurityPermission(SecurityAction.InheritanceDemand, Flags=SecurityPermissionFlag.UnmanagedCode)] protected abstract bool RunDialog(IntPtr hwndOwner);
查看完整回答
反对 回复 2018-12-09
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

@滴答的雨: 但这样也不能说明SaveFileDialog不是用c#写的吧。。能举例其中哪个方法是调用了C++或者delphi的吗??
查看完整回答
反对 回复 2018-12-09
?
千巷猫影

TA贡献1829条经验 获得超7个赞

@KeVinDurant:  reflector.exe能看到的就是C#开发的,当你发现这工具看不到的函数就是其他语言开发的
查看完整回答
反对 回复 2018-12-09
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

@滴答的雨: 怎么看出不是C#???
查看完整回答
反对 回复 2018-12-09
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

@KeVinDurant: 也可能是delphi。只是说已经不是C#了
查看完整回答
反对 回复 2018-12-09
?
温温酱

TA贡献1752条经验 获得超4个赞

@滴答的雨: 在哪里能看出调用了c++??
查看完整回答
反对 回复 2018-12-09
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

@滴答的雨: clr源码??
查看完整回答
反对 回复 2018-12-09
?
富国沪深

TA贡献1790条经验 获得超9个赞

@KeVinDurant:  [SecurityPermission(SecurityAction.InheritanceDemand, Flags=SecurityPermissionFlag.UnmanagedCode)] protected abstract bool RunDialog(IntPtr hwndOwner);下面可能是C++写的了。有没有调用Win32 API和SAT都是根据你的错误信息推测。想看真相,去找clr源码下载来看看
查看完整回答
反对 回复 2018-12-09
?
12345678_0001

TA贡献1802条经验 获得超5个赞

多线程访问了控件就会出现这个问题, 请使用BeginInvoke或Invoke方法
查看完整回答
反对 回复 2018-12-09
?
largeQ

TA贡献2039条经验 获得超7个赞

@滴答的雨: 怎么看出来是不是用c#开发的...还是用的其它组件??怎么查看?
查看完整回答
反对 回复 2018-12-09
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

@KeVinDurant: 推测。因为这种对话框本身就可能是之前留下来的组件啊,不会说每个组件都C#重新开发一次。喜欢研究的话把clr源码下下来研究下
查看完整回答
反对 回复 2018-12-09
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

@滴答的雨: 调用Win32内部方法,该方法肯定访问了现成的OLE组件,且这个组件是以SAT模型公开的...   这句怎么解释。。从哪里可以看出来?
查看完整回答
反对 回复 2018-12-09
?
墨色风雨

TA贡献1853条经验 获得超6个赞

@KeVinDurant: reflector.exe可以看到.NET封装的一些底层代码
查看完整回答
反对 回复 2018-12-09
?
ibeautiful

TA贡献1993条经验 获得超5个赞

@滴答的雨: 用reflector看内部代码是??这句话什么意思?怎么操作。。??
查看完整回答
反对 回复 2018-12-09
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

能否说详细点 System.Windows.Forms.SaveFileDialog s = new SaveFileDialog();这个控件是系统自带的。不是第三方哦。。。
查看完整回答
反对 回复 2018-12-09
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

这是你所要访问的第三方组件就是“单线程单元模型”。所以你访问他你的线程也应该是单线程单元模式
查看完整回答
反对 回复 2018-12-09
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

你换成System.Windows.Forms.TextBox t = new TextBox();就不会啦。。根本性不是这个原因...
查看完整回答
反对 回复 2018-12-09
  • 22 回答
  • 0 关注
  • 734 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信