Несмотря на то, что есть возможность «выйти» из другого потока в поток пользовательского интерфейса, используя Dispatcher
или SynchronizationContext
, я настоятельно рекомендую этого не делать. Это потому, что это делает вашу логику менее тестируемой и более привязанной к ее среде. В случае Dispatcher
он сильно привязан к работе в среде WPF; SynchronizationContext
лучше, но он все еще привязан к работе в какой-то среде.
При таком подходе ваша логика зависит от потока пользовательского интерфейса, например:
код пользовательского интерфейса => логика фонового потока => поток пользовательского интерфейса
Вместо этого используйте IProgress<T>
и Progress<T>
из фоновой логики потока, чтобы сообщать отчеты о ходе работы своему вызывающему, который решает, как отображать эти отчеты о ходе работы. Тогда ваша зависимость выглядит так:
Код интерфейса => логика фонового потока
и ваша фоновая логика потока не зависит от наличия потока пользовательского интерфейса. Это делает его более удобным и проверяемым.