I'm working on a very large and old code base of a desktop winform application. In this code base there are lots of operations performed in background threads, mainly using BackgroundWorker
.
A common pattern in this code base, is to hide complexity by binding artifacts to the thread being executed. For instance, the database connection and transaction are stored in [ThreadStatic]
fields.
I'm trying to change this, and start using async/await
code, and benefit from running the task in any thread of the pool, and allowing a task to continue executing in any other thread by using ConfigureAwait(false)
. I know that [ThreadStatic]
doesn't play nice with async/await
, and I've read several answers over here suggesting to use AsyncLocal<T>
instead.
Given that I'm working on a large code base, as mentioned before, I'm unable to switch to async/await
everywhere in a single shot, and I must do this changes gradually. So the code that before had [ThreadStatic]
will change to AsyncLocal<T>
, but large portions of the code will continue using BackgroundWorker
and won't hit a single async/await
line of code.
Question
Will this work? I need to be able to define some kind of context flow that will work with my new async/await
code, and also keep working with my old non async code which relied on [ThreadStatic]
keeping every thread stuff independent from each other.
If I'm totally wrong and going down the wrong path, suggestions are very welcomed.
Counter.Value.Value
at any time and this will affect all logical call contexts" by any chance? – Georgetta