2016-11-29 67 views
3

我正在使用任務來創建和執行一些操作由不同的線程,一旦操作完成我也有回叫被調用。C#使任務線程Forground

System.Threading.Tasks.Task.Factory.StartNew(() => 
        this._httpService.CreateRecord(new Uri(Configuration.Current.CreateRecordUrl), httpObj)).ContinueWith(
        (response) => 
        { 
         if (!response.IsFaulted) 
         { 
          if (httpObj.CallBack != null) 
          { 
           httpObj.CallBack(response.Result); 
          } 
         } 
         else { 
          this._logger.Error("There was some error whcih causes the task to faild"); 


         } 
        }); 

我的控制檯應用程序的主線程沒有等待任務線程完成,因爲它是後臺線程。 我如何使任務線程前景線程

謝謝

+1

不是很確定你要完成什麼?如果它只是在等待結果,爲什麼不使用* await *? – Robba

+0

@Robba如果我使用伺機然後我的主線程將被阻塞,這是我不想要的, –

+0

但你說的主線程是不是** **等待的任務來完成。當一個線程正在等待時,它會自動被阻止。所以我的問題是,如果你想等待無阻塞,究竟是你期望的行爲? – Robba

回答

3

您應該等待主線程中的任務完成。

更改您的代碼

var task = System.Threading.Tasks.Task.Factory.StartNew(() => 
        this._httpService.CreateRecord(new Uri(Configuration.Current.CreateRecordUrl), httpObj)).ContinueWith(
        (response) => 
        { 
         if (!response.IsFaulted) 
         { 
          if (httpObj.CallBack != null) 
          { 
           httpObj.CallBack(response.Result); 
          } 
         } 
         else { 
          this._logger.Error("There was some error whcih causes the task to faild"); 


         } 
        }); 

task.Wait(); // Wait till your Task has finished. 

()方法有一些重載指定等待多久的等待。如果由於取消的例外而導致任務執行失敗,您還需要添加一些異常處理。

4

StartNew()方法返回一個Task實例。在返回的任務上調用Wait()方法將阻塞主線程,直到任務完成。

static void Main(string[] args) 
{ 
    var task = Task.Factory.StartNew(() => 
    { 
     // ... 
    }); 
    task.Wait(); // The main application thread waits here until the task returns 
} 
1

我的控制檯應用程序的主線程沒有等待任務的線程來完成的,因爲它的後臺線程。

您的應用程序不在等待任務,因爲您沒有告訴它這樣做。

正如其他人已經指出的那樣,使用Wait/Resultawait等待任務,這取決於您是否是在異步上下文或不是。

我怎樣才能使任務線程前景線程。

最有可能你不想這樣做的第一位。 A background線程是一個線程,當所有前景線程已結束時終止線程。線程池中的線程本身背景線程,如果你真的想你的任務安排到前景線程,也就是說,將保持應用程序活着,即使主線程完成一個線程,你必須創建你自己的TaskScheduler。順便說一句,這將是使用Task.Factory.StartNew的理由。如果你不需要Task.Factory.StartNew,去Task.Run