2

我试图让 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 线程。任何帮助表示赞赏。

4

2 回答 2

2

您应该简单地调用thread1.Join(),这将阻塞直到thread1终止。

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

于 2012-07-24T17:45:57.177 回答
2

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

您可以使用Task.ContinueWith队列来为相同的更多工作Task

于 2012-07-24T18:10:08.287 回答