2015-05-05 6 views
1

У меня есть простая модель просмотра, которая содержит модифицированный ObservableCollection, который использует SynchronizationContext.Current.Send для выполнения изменений коллекции в потоке пользовательского интерфейса. Эта коллекция заполнена длинным фоновым потоком.Задача заблокирована при перемещении/изменении размера окна

Это прекрасно работает во всех моих попытках сделать это, однако все они, кажется, заблокированы, перемещая окно или изменяя его размер.

enter image description here Пробелы на этом участке от нажатия и удерживания кнопки мыши в строке заголовка окна.

Различные методы я попытался

Task.Factory.StartNew:

Task.Factory.StartNew(
      () => 
      { 
       double y = 0; 
       while (true) 
       { 
        Values.Add(new ValuePoint(DateTime.Now, Math.Sin(y))); 
        y += 0.1; 
        Thread.Sleep(20); 
       } 
      }); 

ThreadPool.QueueUserWorkItem:

ThreadPool.QueueUserWorkItem(GenerateNumbers); 

private void GenerateNumbers(object obj) 
    { 
     double y = 0; 
     while (true) 
     { 
      Values.Add(new ValuePoint(DateTime.Now, Math.Sin(y))); 

      y += 0.1;     
      Thread.Sleep(20); 
     } 
    } 

новый Тема:

_valueSimThread = new Thread(GenerateNumbers); 
_valueSimThread.IsBackground = true; 
_valueSimThread.Start(); 

ли я misunderst Что-то здесь? Мои ожидания в том, что работа, выполняемая в потоке, не должна зависеть от того, что я делаю в потоке пользовательского интерфейса. Это действие использования SynchronizationContext.Current.Send, чтобы обновить коллекцию как источник моей проблемы?

Каков правильный «шаблон» для наличия ObservableCollection, который обновляется фоновой задачей?

ответ

1

Это действие с использованием SynchronizationContext.Current.Send to обновить коллекцию как источник моей проблемы?

Да, это так. SynchronizationContext.Send закончит публикацию делегата в потоке пользовательского интерфейса. Пока вы перемещаете свой экран, пользовательский интерфейс накачивается множеством сообщений о новом местоположении вашего окна, щелчках мыши и т. Д. Таким образом, вы в очереди запускаете работу с потоком пользовательского интерфейса, который в настоящее время занят.

До тех пор, пока вы используете какую-то коллекцию, связанную с пользовательским интерфейсом, у вас нет другого пути для работы очереди в этом цикле сообщений пользовательского интерфейса.