一旦线程完成,通知主线程

时间:2011-11-14 15:11:39

标签: c# multithreading

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

目前,我所拥有的是以下内容

------begin---------
// codes before....
call thread one....
create thread two instance then start thread two
---------end------------------

在第二个帖子中,我有

--------begin------
 while(threadOne.isalive){
   Thread.Sleep(500);
 }
 call setProgressbar delegate
 ---------end----------------

我这样做而不是在一个线程中放一个var是因为线程一是递归方法.... 我想知道这种做法是否正确,有人可以帮忙吗? 感谢

2 个答案:

答案 0 :(得分:2)

编辑:该行下方的答案回答了您的明确问题,但如果您使用的是.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 :(得分:0)

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