Usando o Task.Yield para superar a inanição do ThreadPool ao implementar o padrão produtor / consumidor

Respondendo à pergunta: Task.Yield - usos reais? Propus usar o Task.Yield, permitindo que um thread de pool seja reutilizado por outras tarefas. Nesse padrão:

  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();
    }

Mas um usuário escreveu

Acho que usar o Task.Yield para superar a fome do ThreadPool ao implementar o padrão produtor / consumidor é uma boa idéia. Sugiro que você faça uma pergunta separada se quiser entrar em detalhes sobre o porqu

Alguém sabe, por que não é uma boa ideia?

questionAnswers(2)

yourAnswerToTheQuestion