一旦线程结束,通知主线程

本文关键字:线程 通知 结束 | 更新日期: 2023-09-27 18:14:48

我的winform有一个线程正在运行,我需要它通知主线程一旦它完成,那么主线程可以设置进度条回到正常状态。

目前,我有如下内容

------begin---------
// codes before....
call thread one....
create thread two instance then start thread two
---------end------------------
在线程2中,我有
--------begin------
 while(threadOne.isalive){
   Thread.Sleep(500);
 }
 call setProgressbar delegate
 ---------end----------------

我这样做,而不是把一个var在线程1是因为线程1是递归方法....我想知道这样做是否正确,有人能帮忙吗?由于

一旦线程结束,通知主线程

编辑:下面的答案回答了你明确的问题,但是如果你正在使用。net 4,你应该考虑在更高的抽象层次上思考——任务。任务并行库提供了比"裸"线程更丰富的功能集,你可以做一些事情,比如注册延续(使用Task.ContinueWith),你甚至可以指定使用哪个任务调度程序,所以你可以直接指定当后台任务完成时,一个特定的动作应该在UI线程上调用


原始回答

最简单的方法是委托第一个线程的职责,例如

public void WrappedStart()
{
    bool success = false;
    try
    {
        StartWork();
        success = true;
    }
    finally
    {
        NotifyCompleted(success);
    }
}
private void StartWork()
{
    // Do your real work here
}
...
Thread t = new Thread(WrappedStart);
t.Start();

如果你的线程可能做不同的事情,你可以改变你的WrapperStart采取行动来包装:

public void WrappedStart(Action action)
{
    ...
}

:

Thread t = new Thread(() => WrappedStart(RealWork));
t.Start();

请注意,如果您确实想要多线程解决方案,只需使用Thread.Join而不是显式循环。

  1. 定义一个委托来处理进度条的更新
  2. 当子线程发生进展时,使用BeginInvoke调用定义的委托来更新UI。