thread.Start() 卡死

calvin_guo 2010-07-31 01:13:31
请问为什么我在执行 t.Start()的时候卡死了 ,请问为什么?谢谢


void Func(){
Thread t=new Thread (new ThreadStart(myFunc));
t.SetApartmentState (ApartmentState.STA);
t.Start();// <---我试过调试运行到这里,一执行t.Start()便卡死了,myFunc的代码也没有被执行。
}

void myFunc(){
...
}
...全文
401 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
calvin_guo 2010-08-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyazhe 的回复:]

去掉这一行试试
t.SetApartmentState (ApartmentState.STA);

STA和MTA的区别
STA的程序每个线程都有自己独立的资源,别的线程访问不到
MTA则是.NET程序的默认线程模型
就是n个线程可以共用一个资源,好处很多,但是也带来了复杂性。
[/Quote]
谢谢wuyazhe , 果然去掉就可以了,我在watch中查看Thread.CurrentThread.ApartmentState是STA

现在代码改成这样:

void Func(){
if (Thread.CurrentThread.GetApartmentState()!=ApartmentState.STA){
Thread t=new Thread (new ThreadStart(myFunc));
t.SetApartmentState (ApartmentState.STA);
t.Start();// <---我试过调试运行到这里,一执行t.Start()便卡死了,myFunc的代码也没有被执行。
}else{
myFunc();
}
}


虽然好了,但是很纳闷的是不知为何STA线程中不能创建一个新的STA线程。 总之是解决了,同时谢谢各位。 散分。
冰凝瞬间1986 2010-08-02
  • 打赏
  • 举报
回复
这个时候可能在主线程中运行吧
calvin_guo 2010-08-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyazhe 的回复:]
去掉这一行试试
t.SetApartmentState (ApartmentState.STA);

STA和MTA的区别
STA的程序每个线程都有自己独立的资源,别的线程访问不到
MTA则是.NET程序的默认线程模型
就是n个线程可以共用一个资源,好处很多,但是也带来了复杂性。
[/Quote]

你好,我在myFunc()里用到了 COM (用到了IAccesible等),所以需要把线程设成STA,设成MTA可能会运行不正常。Func()是在WndProc里面接收到一个自定义消息后调用的。不知道为什么会卡死在t.Start()上。。。
大光呢 2010-07-31
  • 打赏
  • 举报
回复
VS2005在编译多线程工程的时候,会发生某种异常。我已经经历过几次了。建议安装08或者10.
如果不是05版,那要检查你的代码了。从Main开始检查。
deyygywxf 2010-07-31
  • 打赏
  • 举报
回复
去掉这一行试试
t.SetApartmentState (ApartmentState.STA);

STA和MTA的区别
STA的程序每个线程都有自己独立的资源,别的线程访问不到
MTA则是.NET程序的默认线程模型
就是n个线程可以共用一个资源,好处很多,但是也带来了复杂性。
poloyzhang 2010-07-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyazhe 的回复:]

去掉这一行试试
t.SetApartmentState (ApartmentState.STA);

STA和MTA的区别
STA的程序每个线程都有自己独立的资源,别的线程访问不到
MTA则是.NET程序的默认线程模型
就是n个线程可以共用一个资源,好处很多,但是也带来了复杂性。
[/Quote]

上面的试试,另外可以参考一下线程方面的书.
KnowKjava 2010-07-31
  • 打赏
  • 举报
回复
程序有错误
兔子-顾问 2010-07-31
  • 打赏
  • 举报
回复
去掉这一行试试
t.SetApartmentState (ApartmentState.STA);

STA和MTA的区别
STA的程序每个线程都有自己独立的资源,别的线程访问不到
MTA则是.NET程序的默认线程模型
就是n个线程可以共用一个资源,好处很多,但是也带来了复杂性。

HolyPlace 2010-07-31
  • 打赏
  • 举报
回复
检查一下myFunc是否有误
捷哥1999 2010-07-31
  • 打赏
  • 举报
回复
先试试看逍遥给出的方法,去掉这一行试试
t.SetApartmentState (ApartmentState.STA);

如果还是有问题,应该出在这个函数内,你把函数的代码贴出来。
void myFunc(){
...
}

110,536

社区成员

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

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

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