Распараллелил функцию в главном потоке (средствами 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() - много мороки, много кода уже написано.
Еще раз пересмотрел все темы про потоки - ничего подобного там нет... Я так понял, это связано больше с параллелизмом, но ведь даже за всеми фреймворками по паралеллизму стоят рядовые инструменты, значит это можно сделать стандартными средствами.