Task.Factory.StartNew() работает в неправильном потоке, если открыт диалог Modal

Может кто-нибудь объяснить, почему, если приложение С++ запускает компонент .NET UI (все в основном потоке), который, в свою очередь, порождает модальный диалог .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(), кажется правильным в момент запуска моей задачи. Я даже сравнил то, что возвращается в обеих ситуациях, и, похоже, нет никакой разницы.

Ответ 1

Вы на правильном пути. В COM, когда вы работаете в однопоточной квартире, это всего лишь один поток...