handling - static method async c#
Configurar ConfigureAwait(falso) para todo el proyecto/dll (2)
Ahora hay una biblioteca de terceros que soporta esto. El paquete ConfigureAwait.Fody Nuget le permite usar un atributo ConfigureAwait
para marcar una clase, ensamblaje o método de tal manera que todas las .ConfigureAwait(false)
deban ser .ConfigureAwait(false)
. La página del proyecto tiene este ejemplo de uso:
using Fody;
[ConfigureAwait(false)]
public class MyAsyncLibrary
{
public async Task MyMethodAsync()
{
await Task.Delay(10);
await Task.Delay(20);
}
public async Task AnotherMethodAsync()
{
await Task.Delay(30);
}
}
No lo he intentado yo mismo , pero dado lo que sé sobre cómo funcionan los complementos de Fody, es ciertamente posible.
De acuerdo con un artículo en la revista MSDN , es la mejor práctica "Usar ConfigureAwait(false)
cuando pueda". Además, indica: "Si puede usar ConfigureAwait
en algún momento dentro de un método, le recomiendo que lo use para cada espera en ese método después de ese punto". Stephen Cleary , el autor de ese artículo, declara en su blog que "En los métodos asíncronos de su ''biblioteca'' , use ConfigureAwait (falso) siempre que sea posible [énfasis añadido]".
Dado que la mayoría o todas mis declaraciones de await
en un proyecto de biblioteca que se pretende que se use ampliamente deben tener .ConfigureAwait(false)
es posible hacer algo / cambiar una configuración para que el comportamiento predeterminado de espera dentro de mi proyecto / dll es no continuar en el contexto capturado? Es decir, para que pueda omitir todas las llamadas a .ConfigureAwait(false)
y, en su lugar, agregar .ConfigureAwait(
true
)
solo cuando necesito preservar el contexto.
No, no hay opción para esto. El equipo de Microsoft consideró una configuración del compilador o algo por ese comportamiento, pero terminó rechazándolo.
La razón principal es que es bastante difícil saber cómo se comporta el código sin saber cómo se establece el conmutador del compilador.