Я перенес тест для 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 при реализации шаблона производитель / потребитель является хорошей идеей. Я предлагаю вам задать отдельный вопрос, если вы хотите вдаваться в подробности, почему.

Кто-нибудь знает, почему это не хорошая идея?

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

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