C# 调用 如何在多线程中调用 ocx中的函数啊。。。。。。

xktder 2016-10-28 09:08:26
C# 调用 如何在多线程中调用 ocx中的函数啊。。。。。。
厂家提供的ocx有些函数是耗时的,主线程调用的话,会直接卡主主线程。
如何在子线程中调用啊。
我这边调用会报错。当前线程不在单线程单元中,因此无法实例化 ActiveX 控件“db5d6116-f923-4aa0-83d9-d6538f55e174”。
方法上加上 [STAThread]也会报错
private void GetHistoryData()
{
new Thread(new ThreadStart(delegate()
{
try
{
AxNetMediaLib.AxNetMedia ax = new AxNetMediaLib.AxNetMedia();
ax.CreateControl();
ax.SearchTime("0075002A93", 2016, 10, 27, 0, 0, 0, 0, 0, 0, 0, 0);
string sResult = ax.SearchGetFileInfo();
Invoke(new MethodInvoker(delegate()
{
MessageBox.Show(sResult);
}));
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
})) { IsBackground = true }.Start();
}

...全文
641 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
xktder 2016-10-28
  • 打赏
  • 举报
回复
引用 16 楼 u012948520 的回复:
[quote=引用 15 楼 xktder 的回复:] [quote=引用 13 楼 u012948520 的回复:] 我原来做ocx调用的时候也碰到好多问题,还在scdn问过两个问题 一个是忘记注册 http://bbs.csdn.net/topics/391048028 一个是STA和MTA http://bbs.csdn.net/topics/391839759
有注册的,在主线程是可以调用的,但我在新线程中是否还需要重新注册,应该没有关系才对。,线程运行的时候是STA的[/quote]那我就不知道。。。帮不到你,不好意思[/quote]嗯,谢谢。
白衣如花 2016-10-28
  • 打赏
  • 举报
回复
引用 15 楼 xktder 的回复:
[quote=引用 13 楼 u012948520 的回复:] 我原来做ocx调用的时候也碰到好多问题,还在scdn问过两个问题 一个是忘记注册 http://bbs.csdn.net/topics/391048028 一个是STA和MTA http://bbs.csdn.net/topics/391839759
有注册的,在主线程是可以调用的,但我在新线程中是否还需要重新注册,应该没有关系才对。,线程运行的时候是STA的[/quote]那我就不知道。。。帮不到你,不好意思
xktder 2016-10-28
  • 打赏
  • 举报
回复
引用 13 楼 u012948520 的回复:
我原来做ocx调用的时候也碰到好多问题,还在scdn问过两个问题 一个是忘记注册 http://bbs.csdn.net/topics/391048028 一个是STA和MTA http://bbs.csdn.net/topics/391839759
有注册的,在主线程是可以调用的,但我在新线程中是否还需要重新注册,应该没有关系才对。,线程运行的时候是STA的
xktder 2016-10-28
  • 打赏
  • 举报
回复
引用 9 楼 swordvming 的回复:
你把你的try里面整段代码都加上Invoke试试? 比如

this.Invoke(new Action(() =>
                    {
                         Your Code
                    }));
不行的。。。。。
白衣如花 2016-10-28
  • 打赏
  • 举报
回复
我原来做ocx调用的时候也碰到好多问题,还在scdn问过两个问题

一个是忘记注册
http://bbs.csdn.net/topics/391048028

一个是STA和MTA
http://bbs.csdn.net/topics/391839759
白衣如花 2016-10-28
  • 打赏
  • 举报
回复
那你的ocx注册没有啊?
白衣如花 2016-10-28
  • 打赏
  • 举报
回复
你这个错不是1楼提问的错误了吧?
xktder 2016-10-28
  • 打赏
  • 举报
回复
引用 8 楼 u012948520 的回复:
在AxNetMediaLib.AxNetMedia ax = new AxNetMediaLib.AxNetMedia();之前打印一下ApartmentState,看看STA是否设置成功

Console.WriteLine(Thread.CurrentThread.GetApartmentState());

private void GetHistoryDataByThread()
{
Thread serviceFormThread;
serviceFormThread = new Thread(new ThreadStart(delegate()
{
try
{
string sApartmentState = Thread.CurrentThread.GetApartmentState().ToString();
Invoke(new MethodInvoker(delegate()
{
MessageBox.Show(sApartmentState);
}));
AxNetMeidaLib.AxNetMedia ax = new AxNetMeidaLib.AxNetMedia();
ax.CreateControl();
ax.SearchTime("0075002A93", 2016, 10, 27, 0, 0, 0, 0, 0, 0, 0, 0);
string sResult = ax.SearchGetFileInfo();
Invoke(new MethodInvoker(delegate()
{
MessageBox.Show(sResult);
}));
}
catch (Exception ex)
{
Invoke(new MethodInvoker(delegate()
{
MessageBox.Show(ex.ToString());
}));
}
}));
serviceFormThread.SetApartmentState(ApartmentState.STA);///最关键的一句
serviceFormThread.Name = "InfraServiceThread";
serviceFormThread.IsBackground = true;
serviceFormThread.Start();
}
打出来的是STA没错,但还是不行。
不吃辣的阿银 2016-10-28
  • 打赏
  • 举报
回复
你把你的try里面整段代码都加上Invoke试试? 比如

this.Invoke(new Action(() =>
                    {
                         Your Code
                    }));
白衣如花 2016-10-28
  • 打赏
  • 举报
回复
在AxNetMediaLib.AxNetMedia ax = new AxNetMediaLib.AxNetMedia();之前打印一下ApartmentState,看看STA是否设置成功 Console.WriteLine(Thread.CurrentThread.GetApartmentState());
xktder 2016-10-28
  • 打赏
  • 举报
回复
引用 4 楼 u012948520 的回复:
你try里面知道Invoke再MessageBox catch里面怎么就敢直接调了呢。。。
。。。我的锅,有没有办法解决多线程下调用ocx方法啊。
xktder 2016-10-28
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
如果不能多线程执行,就不要纠结了。要么扔掉,要么在主线程去调用。
但是我主界面就全卡了,他那个方法会占用大概5,6秒的时间啊,太长了。
xktder 2016-10-28
  • 打赏
  • 举报
回复
引用 2 楼 u012948520 的回复:
这个问题我碰到过,你别用匿名委托 显示指定STA试试
Thread initThr = new Thread(InitDevice);
                initThr.SetApartmentState(ApartmentState.STA);
                initThr.IsBackground = true;
                initThr.Start();
不行啊,还是报错。
白衣如花 2016-10-28
  • 打赏
  • 举报
回复
你try里面知道Invoke再MessageBox catch里面怎么就敢直接调了呢。。。
  • 打赏
  • 举报
回复
如果不能多线程执行,就不要纠结了。要么扔掉,要么在主线程去调用。
白衣如花 2016-10-28
  • 打赏
  • 举报
回复
这个问题我碰到过,你别用匿名委托 显示指定STA试试
Thread initThr = new Thread(InitDevice);
                initThr.SetApartmentState(ApartmentState.STA);
                initThr.IsBackground = true;
                initThr.Start();
xktder 2016-10-28
  • 打赏
  • 举报
回复
有没有大神求教啊。。。。。。。。
神马都能聊 2016-10-28
  • 打赏
  • 举报
回复
楼主,你可以尝试New一个Timer控件,在主窗口运行Timer事件代码,代码运行间隔可以是100毫秒之类的,这个Timer运行仍然是主线程,但是是异步的,看看还报错吗。 实在不行,你就在调用期间开一个伪进度吧。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧