async void Main()
{
    T0.TT();
}

private class T0
{
    [ThreadStatic] private static int test;

    public static async void TT()
    {
        test = 4;
        var continuation = new System.Threading.Tasks.TaskCompletionSource<int>(System.Threading.Tasks.TaskContinuationOptions.RunContinuationsAsynchronously);
        var th = new Thread(() => { Thread.Sleep(500); Console.WriteLine(test); test = 3; continuation.TrySetResult(5); test = 7; });
        th.Start();
        Console.WriteLine(await continuation.Task);
        Console.WriteLine(test);
    }
}
Output:
0
5
3

Entonces, sin el System.Threading.Tasks.TaskContinuationOptions.RunContinuationsAsynchronously, esto fue escrito para demostrar que el resto del método async se ejecuta en el hilo creado por new Thread(). Sin embargo, con System.Threading.Tasks.TaskContinuationOptions.RunContinuationsAsynchronously todavía encuentra de alguna manera ese valor [ThreadStatic] específico que se establece en el subproceso recién creado (por lo tanto, no puede ser un subproceso TaskScheduler) y se borra tan pronto como TrySetResult regresa.

¿Qué diablos? ¿Cómo está pasando esto?

0
Joshua 7 may. 2021 a las 22:31

1 respuesta

La mejor respuesta

Debería pasar TaskCreationOptions.RunContinuationsAsynchronously, no TaskContinuationOptions.RunContinuationsAsynchronously.

Pasar TaskContinuationOptions.RunContinuationsAsynchronously llamará a sobrecarga que toma un parámetro object, tratándolo como un objeto de" estado "y no como una bandera que controla el comportamiento de TCS.

3
Stephen Cleary 7 may. 2021 a las 20:09