Я перенес тест для Threading.Channels в CoreFX (вместо полной Net Framework) - он начал работать в 2,5 раза быстрее. Теперь это выше 1 миллиона сообщений в секунду на моем компьютере. Я добавил это решение в тест. Они действительно хороши.
ая на вопрос:Task.Yield - реальные использования? Я предложил использовать Task.Yield, позволяющий использовать поток пула другими задачами. По такой схеме:
CancellationTokenSource cts;
void Start()
{
cts = new CancellationTokenSource();
// run async operation
var task = Task.Run(() => SomeWork(cts.Token), cts.Token);
// wait for completion
// after the completion handle the result/ cancellation/ errors
}
async Task<int> SomeWork(CancellationToken cancellationToken)
{
int result = 0;
bool loopAgain = true;
while (loopAgain)
{
// do something ... means a substantial work or a micro batch here - not processing a single byte
loopAgain = /* check for loop end && */ cancellationToken.IsCancellationRequested;
if (loopAgain) {
// reschedule the task to the threadpool and free this thread for other waiting tasks
await Task.Yield();
}
}
cancellationToken.ThrowIfCancellationRequested();
return result;
}
void Cancel()
{
// request cancelation
cts.Cancel();
}
Но один пользователь написал
Я не думаю, что использование Task.Yield для преодоления истощения ThreadPool при реализации шаблона производитель / потребитель является хорошей идеей. Я предлагаю вам задать отдельный вопрос, если вы хотите вдаваться в подробности, почему.
Кто-нибудь знает, почему это не хорошая идея?