2016-11-29 79 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