我试图在后台运行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线程。任何帮助表示赞赏。
答案 0 :(得分:2)
您只需致电thread1.Join()
,这将阻止thread1
终止。
但是,有很多更好的方法可以做到这一点
您应该使用TPL和Task
类来代替。
答案 1 :(得分:2)
如果一个线程只能在另一个线程完成时启动,那么你有一个非常简单的解决方案:在第一个线程上执行整个代码。
您可以使用Task.ContinueWith
为同一Task
排队工作。