2012-07-24 92 views
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線程。任何幫助表示讚賞。

+1

如果您正在尋找WPF解決方案,那麼使用示例WPF代碼而不是控制檯代碼會很有用。 – 2012-07-24 18:39:33

回答

2

如果一個線程只能在另一個線程完成時才能啓動,那麼您有一個非常簡單的解決方案:在第一個線程上執行整個代碼。

您可以使用Task.ContinueWith爲相同的Task排隊更多工作。

+0

我同意您的評論。但是不可能讓他們在單獨的線程中?此外,我更新了我的原始帖子,提到需求是針對WPF應用程序的, – isakavis 2012-07-24 18:37:31

+0

+1。您不再「等待」線程完成,只是定義完成時想要發生的事情 - 這將避免阻止UI。如果您想在任務完成時使用UI執行某些操作,請務必查看「TaskScheduler.FromCurrentSynchronizationContext()' – 2012-07-24 18:41:21

+0

@ user1549435:是的,您可以擁有兩個單獨的線程,但從邏輯角度來看,這沒有任何意義,因爲沒有任何事情發生。如果B在開始之前需要等待A完成,那麼A不妨完成B的所有工作。 – Tudor 2012-07-24 19:23:14

2

您應該簡單地撥打thread1.Join(),這將阻止,直到thread1終止。

但是,有很多更好的方法來做到這一點。
您應該使用TPL和Task類。

+0

在WPF應用程序中,'Join'可能是一個糟糕的主意。 – 2012-07-24 18:38:56

+0

@PeterRitchie:我認爲他會在後臺線程中這樣做。 – SLaks 2012-07-24 20:48:21

相關問題