线程执行顺序的问题

明缘 2012-04-25 09:48:24
main() {
new Thread(Func1);
}

函数Func1 {
.....
obj.invoke(Func2());
.....
logger.print("Func1");
}
Func2() {
...............
logger.print("Func2");
}
如上所示的调用 打印的结果为
Func2
Func1
有2个问题。
1、Func2在执行的时候 Func1在执行obj.invoke(Func2());这个代码后继续执行,是这样的么?
2、如果1是对的,那么如果想在Func1内写入什么样得代码 可以让它等待Func2执行完后在执行Func1剩余的代码。
比如类似以下这样得代码可以实现2的需求么?如果不可以 该怎么样写呢?
Func1 {
.....
obj.invoke(Func2());
.....
if (Func2()) is not over) {
Thread.Sleep(2000);
}
.......
logger.print("Func1");
}

...全文
84 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
Invoke自身就是阻塞的,所以用不着你再去阻塞什么Func1(你也阻塞不着,因为人家Invoke已经处理完阻塞了)。

而线程编程应该尽可能不去阻塞,这是基本的设计原则。
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
1、Func2在执行的时候 Func1在执行obj.invoke(Func2());这个代码后继续执行,是这样的么?
2、如果1是对的,那么如果想在Func1内写入什么样得代码 可以让它等待Func2执行完后在执行Func1剩余的代码。
[/Quote]

没有 obj.invoke(Func2()),哪来的 Func2 被执行啊?你的问题1完全弄反了。

同时问题2也就是因为问题1而自己纠结了。你的代码本来就是“Func1等待Func2执行完,才执行Func1剩余的代码”的。

不过要注意,这里执行obj.invoke(Func2())是画蛇添足的。直接执行 Func2 就行了,不要搞什么Invoke。
  • 打赏
  • 举报
回复
用Thread.Sleep的方法有个缺点,就是只能大致估计执行时间。这个方法应该好些:


private static ManualResetEvent _resetEvent = new ManualResetEvent(false);

private void Func1()
{
obj.invoke(Func2());
_resetEvent.WaitOne();
//等Func2通知继续后再进行下一步操作
。。。
}

private void Func2()
{
//做些什么
_resetEvent.Set();//通知等待线程继续
}

110,567

社区成员

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

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

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