- почему метод обратного вызова не вызывается в T1?
Как правило, это невозможно; если T1 выключен для выполнения какой-либо другой работы, невозможно выполнить маршалинг обратно к нему, если только у потока уже нет механизма для публикации и планирования работы над ним (например, поток пользовательского интерфейса через SynchronizationContext).
- существует ли стандартная схема уведомления о многопоточности?
Я бы сказал нет; Существует несколько шаблонов синхронизации между потоками, каждый из которых применяется к различным целевым сценариям.
- что если T1 нужно возвращаемое значение?
Если T1 нужно возвращаемое значение в текущем стеке, то в конечном итоге ему придется заблокировать, чтобы получить его. Блокировка может произойти путем вызова EndInvoke, использования WaitHandle или других стратегий из предыдущего пункта.
Если вещь, которой нужно возвращаемое значение, это «просто поток» (например, поток пользовательского интерфейса), но не в определенном контексте стека / вызова, то обычно SynchronizationContext.Post или Dispatcher.Invoke используется для маршалинга работы, которая в конечном итоге возвращается назад. в поток пользовательского интерфейса, как только он будет готов.