2015-11-25 2 views
0

Я хочу иметь фоновый процесс (консольное приложение), которое читает очередь сообщений на неопределенный срок.Когда использовать Task.Run

Будет ли это правильным использованием Task.Run?

do 
{ 
    Task.Run(() => 
    { 
     using (var client = new QueueMessageClient()) 
     { 
      var result = client.GetMessages(); 

      // Do something with the resulting messages 
      Parallel.ForEach(result.Messages, message => 
      { 

      }); 
     } 
    }); 
} while (true); 
+0

@ThomasLevesque Я хочу, чтобы для каждой прогона в очереди нужно было «Задавать». – Sam

+0

см. [Это пошаговое руководство] (http://blog.stephencleary.com/2013/05/taskrun-vs-backgroundworker-intro.html) для хорошего обзора Task.Run. Я второй ответ ниже, но у вас есть ваши петли перевернутые –

ответ

2

Не уверены, что вы пытаетесь сделать, но цикл должен, вероятно, внутри лямбды (и внутри using блока), а не вокруг него ... В противном случае вы будете иметь тысячи потоков ЧИТАЮТ очередь сообщений.

Task.Run(() => 
{ 
    using (var client = new QueueMessageClient()) 
    { 
     do 
     { 
      var result = client.GetMessages(); 

      // Do something with the resulting messages 
      Parallel.ForEach(result.Messages, message => 
      { 

      }); 
     } while (true); 
    } 
}); 
+0

Я хочу, чтобы каждое сообщение из очереди на задание, фоновый поток, обрабатывало сообщение, что означает переход в db, систему хранения и т. Д. – Sam

+0

@ Сэм, в этом случае, просто используйте Task.Run для каждого из сообщений в 'result' –

+0

Но вы уверены, что хотите обрабатывать их параллельно? Разве вы не должны ждать, пока не закончите обработку сообщения, прежде чем начать обработку следующего? –

Смежные вопросы