Как мне создать собственный 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
что позволило бы мне обрабатывать продолжения в моем собственном потоке? Это даже правильный подход?