Dar*_*agh 6 .net c# multithreading asynchronous
我不得不在我的代码中使用AsyncLocal替换ThreadLocal的使用,以便在等待异步操作时保持"环境状态".
但是,AsyncLocal令人讨厌的行为是它"流动"到子线程.这与ThreadLocal不同.反正有没有阻止这个?
class Program
{
private static readonly ThreadLocal<string> ThreadState = new ThreadLocal<string>();
private static readonly AsyncLocal<string> AsyncState = new AsyncLocal<string>();
static async Task MainAsync()
{
ThreadState.Value = "thread";
AsyncState.Value = "async";
await Task.Yield();
WriteLine("After await: " + ThreadState.Value);
WriteLine("After await: " + AsyncState.Value); // <- I want this behaviour
Task.Run(() => WriteLine("Inside child task: " + ThreadState.Value)).Wait(); // <- I want this behaviour
Task.Run(() => WriteLine("Inside child task: " + AsyncState.Value)).Wait();
Run Code Online (Sandbox Code Playgroud)
Kev*_*sse 11
AsyncLocal将数据存储在执行上下文中,该上下文由大多数API(包括Task.Run)自动传送.
防止这种情况的一种方法是在需要时明确地抑制流量:
using (ExecutionContext.SuppressFlow())
{
Task.Run(...);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1722 次 |
| 最近记录: |