Распараллелил функцию в главном потоке (средствами Rx Framework, но это значения не имеет, пробовал и через BeginInvoke()):
public void Start()
        {
            //...
            var startSession = Observable.ToAsync<string, string>(this.StartSession);
            startSession(credentionals.Login, credentionals.Password);
            //...
        }
Она вызывает асинхронно долгоиграющий метод, который в конце должен кинуть эвент всем, кто его слушает:
private void StartSession(string login, string password)
        {
            //...
            this.OnStarted(EventArgs.Empty);
        }
Встал вопрос - как сделать так, чтоб метод this.OnStarted() вызывался в главном потоке? Не могу понять, возможно ли это вообще. 
Знаю, что обратная сторона Fork'а - Join, но при его помощи не выходит "слить" потоки обратно.
Из многопоточности пока только освоил разделение, lock'и и ManualResetEvent's  

PS: дело в том, что подписчики на событие Started - в основном GUI-компоненты, и они вредничают, если менять их не из главного потока. Переделывать UI на безопасные BeginInvoke() - много мороки, много кода уже написано. 
Еще раз пересмотрел все темы про потоки - ничего подобного там нет... Я так понял, это связано больше с параллелизмом, но ведь даже за всеми фреймворками по паралеллизму стоят рядовые инструменты, значит это можно сделать стандартными средствами.