2016-11-29 2 views
3

Я использую Task для создания и выполнения некоторых операций по разному потоку, как только операция завершена, у меня также есть обратный вызов для вызова.C# Сделать Task Threads 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

Не уверен, что вы пытаетесь достичь? Если он просто ждет результата, почему бы просто не использовать * wait *? – 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. 

The Wait() метод имеет несколько перегруженных, чтобы определить, как долго ждать. Также вам нужно добавить некоторую обработку исключений, если выполнение задачи не выполняется из-за исключения отмены.

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/Result или await ждать задачи, в зависимости от того, вы в асинхронном контексте или нет.

Как я могу сделать задачу нить потока переднего плана.

Скорее всего, вы не хотите этого делать в первую очередь. A background thread is thread, который заканчивается, когда все переднего плана ниток. Потоки пула потоков по сути являются фоном тем, если вы на самом деле хотите запланировать свою задачу до фоном потоком, то есть потоком, который будет поддерживать процесс приложения, даже если основной поток завершен, вам придется создайте свой собственный TaskScheduler. Это, кстати, послужило бы основанием для использования Task.Factory.StartNew. Если вы не необходимоTask.Factory.StartNew, перейдите для Task.Run.