Qual é o efeito do AsyncLocal <T> no código não assíncrono / de espera?
Estou trabalhando em uma base de código muito grande e antiga de um aplicativo winform para desktop. Nesta base de código, há muitas operações executadas em threads em segundo plano, principalmente usandoBackgroundWorker
.
Um padrão comum nessa base de código é ocultar a complexidade vinculando artefatos ao encadeamento que está sendo executado. Por exemplo, a conexão e a transação do banco de dados são armazenadas em[ThreadStatic]
Campos.
Estou tentando mudar isso e começar a usarasync/await
código e se beneficie da execução da tarefa em qualquer encadeamento do pool e permitindo que uma tarefa continue executando em qualquer outro encadeamento usandoConfigureAwait(false)
. Eu sei disso[ThreadStatic]
não joga bem comasync/await
, e eu li várias respostas aqui sugerindo usarAsyncLocal<T>
em vez de.
Como estou trabalhando em uma grande base de código, como mencionado anteriormente, não consigo mudar paraasync/await
em todos os lugares em um único tiro, e devo fazer isso muda gradualmente. Então o código que antes tinha[ThreadStatic]
mudará paraAsyncLocal<T>
, mas grandes partes do código continuarão usandoBackgroundWorker
e não vai bater um únicoasync/await
linha de código.
Pergunta, questão
Isso vai funcionar? Preciso definir algum tipo de fluxo de contexto que funcione com meu novoasync/await
e também continuo trabalhando com meu antigo código não assíncrono, que contava com[ThreadStatic]
mantendo todos os itens de thread independentes um do outro.
Se eu estiver totalmente errado e seguir o caminho errado, sugestões são muito bem-vindas.