Как прикрепить SynchronizationContext к потоку, отличному от пользовательского интерфейса

#c# #multithreading #.net-3.5 #synchronization

#c# #многопоточность #.net-3.5 #синхронизация

Вопрос:

Я работаю над модульным тестированием, и мне нужно передать контекст одного потока другому. В реальной жизни первым будет поток пользовательского интерфейса, и все будет в порядке (я надеюсь). Но в моем модульном тестировании нет пользовательского интерфейса (это какой-то поток тестирования). Я прочитал: «Один поток, который всегда имеет SynchronizationContext, — это поток пользовательского интерфейса.» Возможно ли присоединить контекст одного потока (не пользовательского интерфейса) к другому? Как это сделать?

Ответ №1:

Я думаю, вам, возможно, потребуется пересмотреть свою стратегию тестирования.

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

Или попробуйте создать test, чтобы ваша форма GUI вела себя так, как ожидалось, после того, как вы получите некоторые результаты из вашего обратного потока (т. Е. отобразите его правильно).

Создание модульных тестов для графических интерфейсов довольно сложно. Вот почему люди склонны удалять всю бизнес-и любую другую логику за пределами GUI, чтобы ее можно было легко протестировать.

возможно, вы можете рассмотреть возможность использования WPF с MVVM или WinForms с MVP, что упрощает рисование этой линии

Комментарии:

1. Вы правы, я никогда не использовал бизнес-логику в UI многопоточность. Я полностью понимаю, как это сделать, но у меня большой богатый пользовательский интерфейс с логикой so, и у меня не так много времени на его редизайн. Итак, я ищу решение «малой кровью».