и значения устанавливаются только из их собственных потоков, тогда этот поток имеет только один логический контекст вызова, и запись / чтение значений будет работать так же, как
отаю над очень большой и старой кодовой базой приложения winform для настольных компьютеров. В этой базе кода есть много операций, выполняемых в фоновых потоках, в основном с использованиемBackgroundWorker
.
Распространенным шаблоном в этой кодовой базе является скрытие сложности путем привязки артефактов к выполняемому потоку. Например, соединение с базой данных и транзакция хранятся в[ThreadStatic]
поля.
Я пытаюсь изменить это, и начать использоватьasync/await
код и получить выгоду от запуска задачи в любом потоке пула и разрешения задачи продолжить выполнение в любом другом потоке с помощьюConfigureAwait(false)
, я знаю это[ThreadStatic]
не играет сasync/await
и я прочитал несколько ответов здесь, предлагающих использоватьAsyncLocal<T>
вместо.
Учитывая, что я работаю над большой кодовой базой, как упоминалось ранее, я не могу переключиться наasync/await
везде в одном кадре, и я должен делать это постепенно. Так что код, который раньше был[ThreadStatic]
изменится наAsyncLocal<T>
, но большие части кода будут продолжать использоватьBackgroundWorker
и не ударит ни одногоasync/await
строка кода.
Вопрос
Будет ли это работать? Мне нужно иметь возможность определить некоторый контекстный поток, который будет работать с моим новымasync/await
код, а также продолжать работать с моим старым не асинхронным кодом, который опирался на[ThreadStatic]
сохраняя каждую нить независимо друг от друга.
Если я полностью ошибаюсь и иду по неверному пути, предложения очень приветствуются.