W oparciu o długą dyskusję na czacie i dużo kopania, wygląda na to, że w niektórych niejasnych scenariuszach TPL przechwytuje dedykowany wątek czytnika, gdy robimy takie rzeczy jak .TrySetResult
(co:robimy często). Powoduje to natychmiastowe zakleszczenie, jeśli wykonujesz wywołanie synchroniczne, ponieważ prawdopodobnie nie może przetworzyć żadnych danych gniazda, jeśli jest zajęty oczekiwaniem na zakończenie zadania (które zawsze zostanie ukończone samo). W rzeczywistości mamy kod specjalnie, aby temu zapobiec , ale wygląda na to, że obejście faktycznie wymusza tak się stanie w niektórych innych scenariuszach. Co... jest okropne. Zobaczę, co uda mi się znaleźć. Ale w zasadzie problem polega na tym, że obecnie , w niektórych ograniczonych scenariuszach , TaskCompletionSource.TrySetResult
daje prawo TPL do uruchamiania synchronicznych kontynuacji. Obejmuje to Task.WhenAny
.