Связывание данных, многопоточность и модульное тестирование - PullRequest
2 голосов
/ 15 декабря 2011

У меня есть модель, которая связана с данными в элементах управления в представлении. Одно из связанных свойств (типа BindingList<T>) обновляется из другого потока.

С помощью этого ответа я решил «Операция с несколькими потоками недопустима» следующим образом (.NET 4.0, TPL):

public class Model : INotifyPropertyChanged
{
    private readonly TaskFactory _uiThreadTaskFactory =
        new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext());

    private readonly object _myPropertyLocker = new object();

    private void Handler()
    {
        // In another thread

        _uiThreadTaskFactory.StartNew(
            () =>
                {
                    lock (_myPropertyLocker)
                    {
                        MyProperty.Add(someStuff);
                    }
                });
    }
}

Это работало - пока я не попытался запустить свои юнит-тесты в ReSharper's runner (v5.1). Они скинули ошибку

Текущий SynchronizationContext не может использоваться в качестве TaskScheduler.

на линии

new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext());

Как я могу решить это настолько элегантно, насколько это возможно?

1 Ответ

3 голосов
/ 15 декабря 2011

Вам необходимо предоставить SynchronizationContext. Ссылка: Текущий SynchronizationContext нельзя использовать в качестве TaskScheduler .

[SetUp]
public void TestSetUp()
{
  SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
}
...