同步会启动新的线程吗
相信大家都知道有同步和异步两种调用方式.区别我就不多说了,只想请教一下:同步调用的时候(比方说invoke),此时,主程序的线程会处于阻塞状态,等待被调用方完成后,才可以继续执行。
但此时,主线程既然都阻塞了,是不是应该有个新的线程去执行被调用方的操作呢?
好多都说,异步才会在线程池里启动一个新的线程,同步不会,使用相同线程。
可是不会的话,这个线程已经阻塞了,还怎么继续使用呢? --------------------编程问答-------------------- Invoke就是在主线程里被执行。Invoke下面的代码,只是顺序等待执行。 --------------------编程问答--------------------
那为什么说在调用Invoke时会将主线程阻塞呢?阻塞的话,Invoke还怎么在主线程里执行呢。 --------------------编程问答--------------------
那是因为调用Invoke的代码通常是在子线程中执行着呢,所以他才阻塞子线程,等待主线程去执行这一点代码。如果不知道起点,那么你后边的议论就彻底偏了。
通常需要这样编程:
if(ctrl.RequireInvoke)
ctrl.Invoke(abc);
else
abc();
这就是起点,这已经表明了它会判断当前是主线程还是在子线程中,只有当前本身就在子线程中(或者至少说是不在创建ctrl的线程中)时才会去调用Invoke。
如果你以为是什么“在主线程中去调用Invoke”这就自寻烦恼了。 --------------------编程问答-------------------- 阻塞的意思是该线程(不是只有主线程才会被阻塞)在“等待”...等到有结果了当然继续执行,你哪里不明白? --------------------编程问答-------------------- 嗯,上面函数写错了名字,应该是:
if(ctrl.InvokeRequired)
ctrl.Invoke(abc);
else
abc();
另外,能够真正地异步,就不要搞假的异步,不要阻塞而应该使用beginXXXX这样的异步执行方法。 --------------------编程问答--------------------
"只有当前本身就在子线程中(或者至少说是不在创建ctrl的线程中)时才会去调用Invoke"
一个线程不是只能做一件事吗, 在这个子线程中他调用了Invoke, 那这个子线程就会阻塞,还怎么利用这个线程来执行Invoke的操作呢?
补充:.NET技术 , C#