Кто-нибудь может объяснить, почему, если приложение C ++ запускает компонент пользовательского интерфейса .NET (все в основном потоке), который, в свою очередь, порождает модальное диалоговое окно .NET, а затем пытается использовать TaskScheduler .FromCurrentSynchronizationContext ();
в Task.Factory.StartNew
вызовет выполнение задачи в рабочем потоке? Этого не происходит, если я не показываю диалог или сохраняю контекст вне контекста перед показом диалога.
Я пытался создать фиктивную программу, чтобы показать это, но у меня ничего не вышло. Думаю, это связано с тем, что основным процессом является COM.
Есть идеи?
Хорошо, мой код выглядит так
private void RunStateMachine(IQ4UpgraderState State)
{
_State = State;
Task.Factory.StartNew(() => StateMachine(), _TokenSource.Token, TaskCreationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());
}
private void StateMachine()
{
switch (_State)
{
//Some Code
}
}
Когда задача запускается, текущим контекстом является главный поток, но когда запускается вызов StateMachine, он находится в рабочем потоке, если и только если Перед запуском этого кода я открыл модальный диалог. Контекст, возвращаемый TaskScheduler.FromCurrentSynchronizationContext (), кажется правильным в момент запуска моей задачи. Я даже сравнил то, что возвращается в обеих ситуациях, и, похоже, нет никакой разницы.