Как мне создать собственный SynchronizationContext, чтобы все продолжения могли обрабатываться моим собственным однопоточным циклом событий?

Допустим, вы пишете пользовательскую однопоточную библиотеку GUI (или что-то еще с циклом событий). Из моего понимания, если я используюasync/awaitили просто обычные продолжения TPL, все они будут запланированы наTaskScheduler.Current (или наSynchronizationContext.Current).

Проблема в том, что продолжение может захотеть получить доступ к однопоточным частям библиотеки, что означает, что оно должно выполняться в одном и том же цикле событий. Например, при простом игровом цикле события могут обрабатываться так:

// All continuation calls should be put onto this queue
Queue<Event> events;

// The main thread calls the `Update` method continuously on each "frame"
void Update() {
    // All accumulated events are processed in order and the queue is cleared
    foreach (var event : events) Process(event);

    events.Clear();
}

Теперь, учитывая мое предположение правильно и TPL используетSynchronizationContext.Currentлюбой код в приложении должен быть в состоянии сделать что-то вроде этого:

async void Foo() {
    someLabel.Text = "Processing";

    await BackgroundTask();

    // This has to execute on the main thread
    someLabel.Text = "Done";
}

Что подводит меня к вопросу.Как реализовать кастомSynchronizationContext что позволило бы мне обрабатывать продолжения в моем собственном потоке? Это даже правильный подход?

Ответы на вопрос(1)

Ваш ответ на вопрос