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

Место общения программистов C#
Ответить
Anonymous
 Как создать собственный SynchronizationContext, чтобы все продолжения могли обрабатываться моим собственным однопоточным

Сообщение Anonymous »

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

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

Код: Выделить всё

// All continuation calls should be put onto this queue
Queue 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, который позволит мне обрабатывать продолжения в моем собственном потоке? Это вообще правильный подход?

Подробнее здесь: https://stackoverflow.com/questions/392 ... ons-can-be
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»