- У меня есть два разных потока событий.
- Поток 1 – это поток событий по запросу. поток очень быстро меняющихся событий (подумайте о ценах на финансовые инструменты)
- Поток 2 движется гораздо медленнее (подумайте о действиях, которые следует предпринять в зависимости от этих цен)
< li>Оба потока должны обрабатываться в одном совместном рабочем потоке/задаче. - Реализация должна быть максимально эффективной.
- Поток 2 должен обрабатываться с помощью приоритет/перед потоком 1
Возможно, лучшим способом было бы поместить эти события в отдельные каналы и читать их из обоих. каналов.
Но как лучше всего это сделать?
Грубо говоря, я мог бы сделать это:
Код: Выделить всё
class Example {
private readonly Channel _channel1 = Channel.CreateBounded(....);
private readonly Channel _channel2 = Channel.CreateBounded(....);
public async Task Worker(CancellationToken ct) {
while(!ct.IsCancellationRequested) {
var valueTask1 = _channel1.Reader.WaitToReadAsync(ct);
var valueTask2 = _channel2.Reader.WaitToReadAsync(ct);
// Waaait a moment.. this is wishful thinking! WhenAny for ValueTasks does not exist, at least not out-of-the-box
if(await ValueTaskExtensions.WhenAny(valueTask1, valueTask2) == 0)
{
// valueTask1 triggered
var element = await _channel1.Reader.ReadAsync(ct);
// Process
} else {
// valueTask2 triggered
var element = await _channel2.Reader.ReadAsync(ct);
// Process
}
}
}
}
Однако существует вклад сообщества в реализацию WhenAny, хотя я не использовал те, которые на практике пока не могу судить об их качестве и возможных предостережениях.
Есть ли более умный способ читать по двум каналам из одной ветки чтения, не покидая чудесный мир ValueTasks ?
Подробнее здесь: https://stackoverflow.com/questions/785 ... ame-thread