2014-10-20 5 views
0

После того, как я нажал кнопку «Пуск» в WPF, программа перешла на часть TPL. Затем основное окно замерзало.Windows freezing withTPL

private void Start_Click(object sender, RoutedEventArgs e) 
{ 
    var producer = Producer(); 
    var consumer = Consumer(); 
    Task.WaitAll(producer, consumer); 
} 
async Task Producer() 
    { 
     try 
     { 
       // add items to the queue 
    async Task Consumer() 
    { 
     try 
     { 
      var executionDataflowBlockOptions = new ExecutionDataflowBlockOptions 
      { 
       //TaskScheduler = TaskScheduler.FromCurrentSynchronizationContext(), 
       MaxDegreeOfParallelism = 4 
      }; 
      var consumerBlock = new ActionBlock<AppointmentReminder>(
      r=> 
      { 
       string s = RunScript(r); 
       Dispatcher.Invoke((Action)delegate() 
       { 
        slider.Value = slider.Value - 1; // update the slider value; 
       }); 


      },executionDataflowBlockOptions); 
      // m_Queue is bufferBlock 
      m_Queue.LinkTo(
      consumerBlock, new DataflowLinkOptions { PropagateCompletion = true }); 
      await Task.Delay(500); 
     } 

Вопросы:

  1. Как иметь дело с окном замораживания? Если я раскомментирую TaskScheduler = TaskScheduler.FromCurrentSynchronizationContext(), он все еще замерзает, и часть клиента никогда не будет достигнута.
  2. Я хочу обновить слайдер на slider.Value = slider.Value - 1;, это тоже не удалось.
+0

Вы должны форматировать Ваш код. – i3arnon

ответ

4

Task.WaitAll ждет синхронно, блокируя вызывающую нить. В вашем случае, который блокирует поток графического интерфейса «замораживания» ваших окон и может даже привести к тупиковой ситуации.

await Task.WhenAll Использование в качестве обработчика события async void (единственный случай, когда async void приемлемо) асинхронно ждать, не блокируя поток:

private async void Start_Click(object sender, RoutedEventArgs e) 
{ 
    var producer = Producer(); 
    var consumer = Consumer(); 

    await Task.WhenAll(producer, consumer); 
} 
+0

У меня есть ошибка: 'Не могу дождаться 'void''. –

+0

@Love ** 'WhenAll' **. не 'WaitAll'. – i3arnon

+0

Это работает, спасибо за помощь. –