怎么判断线程结束(不用循环侦测的方法)

cleverzhangxu 2009-12-01 10:19:45
一个线程结束后,我需要执行一个我自定义的方法ccc。听说用委托回调的方法能完成,谁知道怎么写。

例如:

private void aaa()
{
//以前是这么写的
Thread th=new Thread(new ThreadStart(bbb));
th.Start();
}

//线程中执行的方法
private void bbb()
{
//执行的代码
}

//线程结束后执行的方法
private void ccc()
{
//执行的代码
}

是不是应该这么写 Thread th=new Thread(里面是个委托),然后怎么判断这个委托结束了呢。
循环判读线程是否存活的那个方法我会写,请大家就别写了。
...全文
329 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
cleverzhangxu 2010-02-03
  • 打赏
  • 举报
回复
感谢大家的回复,由于前些日子发生点事情,没有及时给分。

刚才对大家回复的内容我做了一下测试。

我主要是想 线程结束后 运行某个方法

2楼 这段代码表示的是在线程中运行的ccc()方法,而不是线程结束后

我个人还是比较喜欢 13楼说的BackgroundWorker控件,它有一个RunWorkerCompleted()方法,当线程结束后,程序会自动运行它。比较简便易懂。

6楼 和 10楼 说的ManualResetEvent,用它也可以实现,但是需要在线程方法的最后做一个运行结束的标记,然后 在主进程中的 线程名.start() 后面用 WaitHandle.WaitAll 一直等待刚才那个标记,然后在执行下面的代码

3楼 这段代码是 在线程中的最后引发一个事件,然后执行我那个ccc()方法,但是我觉得还是没有摆脱线程,还是在线程里面,跟2楼是一个意思。

4楼 自己做了一个类,类里面运行了一个线程,线程中对于我那个程序来说,运行的顺序是bbb(),然后是ccc(),感觉2个方法确实是分开了,不是以前的嵌套关系了,但是ccc()这个方法还是属于 th 这个线程之内,感觉分离的不是那么明朗。
cc_net 2009-12-02
  • 打赏
  • 举报
回复
一种是使用异步回调 Delgate.beginInvoke

或者是基于事件驱动的BackgroundWorker


也可以用同步对象进行控制

ztenv 2009-12-02
  • 打赏
  • 举报
回复
充分利用事件/委托。。。。。。是等待通知,而不是轮询。。。
liherun 2009-12-02
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 walkghost 的回复:]
我过来学习下子。
[/Quote]
我喜欢你的签名
walkghost 2009-12-02
  • 打赏
  • 举报
回复
我过来学习下子。
ProjectDD 2009-12-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 gomoku 的回复:]
C# codeprivatevoid bbb()
{//执行的代码
ccc();//<---}
[/Quote]

这样简单直接啊
wapit 2009-12-02
  • 打赏
  • 举报
回复
我现在觉得.NET 2.0以上带的BackgroundWorker用起来比自己弄一堆的Thread要爽
hitlcyu19 2009-12-02
  • 打赏
  • 举报
回复
上面说的很清楚了
zhujiazhi 2009-12-01
  • 打赏
  • 举报
回复
AutoResetEvent
EnoughPoint 2009-12-01
  • 打赏
  • 举报
回复
4# 已给出答案
建议LZ做下封装:
public delegate void ThreadExeHandler();
public delegate void AfterThreadExeHandler();
MyThread
{
public event ThreadExeHandler ThreadExeEvent;
public event AfterThreadExeHandler AfterThreadExeEvent;

public void Start()
{
Thread th=new Thread(new ThreadStart(startThread));
th.start();
}


private startThread()
{
if(null != ThreadExeEvent)
{
ThreadExeEvent();//你的线程函数
if(null != AfterThreadExeEvent)
{
AfterThreadExeEvent();//你线程结束时的函数
}
}
}


}
zetee 2009-12-01
  • 打赏
  • 举报
回复
public event EventHandle AfterThread;
private void aaa()
{
//以前是这么写的
Thread th=new Thread(new ThreadStart(bbb));
th.Start();
}

//线程中执行的方法
private void bbb()
{
//执行的代码
if(AfterThread!=null)
AfterThread(this,null);
} //线程到这里就算是结束。


//引发事件后,再调用CCC()
//线程结束后执行的方法
private void ccc()
{
//执行的代码
}
龟仙 2009-12-01
  • 打赏
  • 举报
回复
if (t.ThreadState == ThreadState.Stopped)
gomoku 2009-12-01
  • 打赏
  • 举报
回复
private void bbb() 
{
//执行的代码

ccc(); //<---
}
liherun 2009-12-01
  • 打赏
  • 举报
回复
关注
烈火蜓蜻 2009-12-01
  • 打赏
  • 举报
回复
public delegate void ThreadExeHandler(); 
public ThreadExeHandler eventHandler;
private void aaa()
{
//以前是这么写的
Thread th=new Thread(new ThreadStart(bbb));
eventHandler = new ThreadExeHandler(ccc);
th.Start();
}

//线程中执行的方法
private void bbb()
{
//执行的代码

if(eventHandler!=null) eventHandler.Invoke();
}

//线程结束后执行的方法
private void ccc()
{
//执行的代码
}
Sugar_Tiger 2009-12-01
  • 打赏
  • 举报
回复
如果是需要等待一个线程结束可以用AutoResetEvent,
多个的话可以用WatiAll和manulResetEvent.
参考:
ManualResetEvent和AutoResetEvent用法小试

[Quote=引用 6 楼 zhujiazhi 的回复:]
AutoResetEvent
[/Quote]
friday478 2009-12-01
  • 打赏
  • 举报
回复
mark
Crystalzhou 2009-12-01
  • 打赏
  • 举报
回复
mark
_autotest 2009-12-01
  • 打赏
  • 举报
回复
在线程里写一个调用外部应用的方法:
this.BeginInvoke(mydelegate, new object[] {i});传一个委托加上你需要的参数信息就ok了。

111,120

社区成员

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

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

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