и значения устанавливаются только из их собственных потоков, тогда этот поток имеет только один логический контекст вызова, и запись / чтение значений будет работать так же, как

отаю над очень большой и старой кодовой базой приложения winform для настольных компьютеров. В этой базе кода есть много операций, выполняемых в фоновых потоках, в основном с использованиемBackgroundWorker.

Распространенным шаблоном в этой кодовой базе является скрытие сложности путем привязки артефактов к выполняемому потоку. Например, соединение с базой данных и транзакция хранятся в[ThreadStatic] поля.

Я пытаюсь изменить это, и начать использоватьasync/await код и получить выгоду от запуска задачи в любом потоке пула и разрешения задачи продолжить выполнение в любом другом потоке с помощьюConfigureAwait(false), я знаю это[ThreadStatic] не играет сasync/awaitи я прочитал несколько ответов здесь, предлагающих использоватьAsyncLocal<T> вместо.

Учитывая, что я работаю над большой кодовой базой, как упоминалось ранее, я не могу переключиться наasync/await везде в одном кадре, и я должен делать это постепенно. Так что код, который раньше был[ThreadStatic] изменится наAsyncLocal<T>, но большие части кода будут продолжать использоватьBackgroundWorker и не ударит ни одногоasync/await строка кода.

Вопрос
Будет ли это работать? Мне нужно иметь возможность определить некоторый контекстный поток, который будет работать с моим новымasync/await код, а также продолжать работать с моим старым не асинхронным кодом, который опирался на[ThreadStatic] сохраняя каждую нить независимо друг от друга.

Если я полностью ошибаюсь и иду по неверному пути, предложения очень приветствуются.

Ответы на вопрос(1)

Ваш ответ на вопрос