将结果从一个线程通知给另一个线程或等待来自第一个线程的反馈以继续第二个线程

时间:2012-07-24 17:43:29

标签: c# multithreading

我试图在后台运行2个线程来执行任务。我必须按顺序创建线程并继续执行程序。但是第二个线程只有在第一个完成时才必须执行它的工作。另外,还有一个澄清。我希望在WPF应用程序上有这个解决方案。不需要UI反馈。我需要的只是第一个任务的状态更新。我同意,如果我们在一个线程中完成所有操作就可以了。但是,即使用户离开创建该线程的屏幕,我们也希望第二个线程能够单独执行更多操作。

以下是样本:

class Program
{

    static string outValue;
    static bool _isFinished = false;

    static void Main(string[] args)
    {
        ThreadStart thread1 = delegate()
        {
            outValue = AnotherClass.FirstLongRunningTask();
            // I need to set the _isFinished after the long running finishes..
            // I cant wait here because I need to kick start the next thread and move on.
            // 
        };
        new Thread(thread1).Start();

        ThreadStart thread2 = delegate()
        {
            while (!_isFinished)
            {
                Thread.Sleep(1000);
                Console.WriteLine("Inside the while loop...");
            }
            if (!string.IsNullOrEmpty(outValue))
            {
                // This should execute only if the _isFinished is true...
                AnotherClass.SecondTask(outValue);    
            }

        };
        new Thread(thread2).Start();

        for (int i = 0; i < 5000; i++)
        {
            Thread.Sleep(500);
            Console.WriteLine("I have to work on this while thread 1 and thread 2 and doing something ...");    
        }    
        Console.ReadLine();

    }



}


public class AnotherClass
{
    public static string FirstLongRunningTask() 
    {
        Thread.Sleep(6000);
        return "From the first long running task...";
    }

    public static void SecondTask(string fromThread1) 
    {
        Thread.Sleep(1000);
        Console.WriteLine(fromThread1);
    }
}

我在哪里设置_isFinished?
我无法使用BackgroundWorker线程。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

您只需致电thread1.Join(),这将阻止thread1终止。

但是,有很多更好的方法可以做到这一点 您应该使用TPL和Task类来代替。

答案 1 :(得分:2)

如果一个线程只能在另一个线程完成时启动,那么你有一个非常简单的解决方案:在第一个线程上执行整个代码。

您可以使用Task.ContinueWith为同一Task排队工作。