当前位置:编程学习 > C#/ASP.NET >>

同步会启动新的线程吗

相信大家都知道有同步和异步两种调用方式.区别我就不多说了,只想请教一下:
同步调用的时候(比方说invoke),此时,主程序的线程会处于阻塞状态,等待被调用方完成后,才可以继续执行。
但此时,主线程既然都阻塞了,是不是应该有个新的线程去执行被调用方的操作呢?
好多都说,异步才会在线程池里启动一个新的线程,同步不会,使用相同线程。
可是不会的话,这个线程已经阻塞了,还怎么继续使用呢? --------------------编程问答-------------------- Invoke就是在主线程里被执行。Invoke下面的代码,只是顺序等待执行。 --------------------编程问答--------------------
引用 1 楼 fangxinggood 的回复:
Invoke就是在主线程里被执行。Invoke下面的代码,只是顺序等待执行。


那为什么说在调用Invoke时会将主线程阻塞呢?阻塞的话,Invoke还怎么在主线程里执行呢。 --------------------编程问答--------------------
引用 2 楼 leon032 的回复:
那为什么说在调用Invoke时会将主线程阻塞呢?阻塞的话,Invoke还怎么在主线程里执行呢。


那是因为调用Invoke的代码通常是在子线程中执行着呢,所以他才阻塞子线程,等待主线程去执行这一点代码。如果不知道起点,那么你后边的议论就彻底偏了。

通常需要这样编程:
if(ctrl.RequireInvoke)
    ctrl.Invoke(abc);
else
    abc();


这就是起点,这已经表明了它会判断当前是主线程还是在子线程中,只有当前本身就在子线程中(或者至少说是不在创建ctrl的线程中)时才会去调用Invoke。

如果你以为是什么“在主线程中去调用Invoke”这就自寻烦恼了。 --------------------编程问答-------------------- 阻塞的意思是该线程(不是只有主线程才会被阻塞)在“等待”...等到有结果了当然继续执行,你哪里不明白? --------------------编程问答-------------------- 嗯,上面函数写错了名字,应该是:
if(ctrl.InvokeRequired)
    ctrl.Invoke(abc);
else
    abc();
 


另外,能够真正地异步,就不要搞假的异步,不要阻塞而应该使用beginXXXX这样的异步执行方法。 --------------------编程问答--------------------
引用 3 楼 sp1234 的回复:
引用 2 楼 leon032 的回复:
那为什么说在调用Invoke时会将主线程阻塞呢?阻塞的话,Invoke还怎么在主线程里执行呢。


那是因为调用Invoke的代码通常是在子线程中执行着呢,所以他才阻塞子线程,等待主线程去执行这一点代码。如果不知道起点,那么你后边的议论就彻底偏了。

通常需要这样编程:

C# code
if(ctrl.RequireInvoke)
  ……


"只有当前本身就在子线程中(或者至少说是不在创建ctrl的线程中)时才会去调用Invoke"

一个线程不是只能做一件事吗, 在这个子线程中他调用了Invoke, 那这个子线程就会阻塞,还怎么利用这个线程来执行Invoke的操作呢?
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,