【发布时间】:2020-06-18 22:53:41
【问题描述】:
每次等待完成“选项”时是否使用 ThreadStatic 并设置上下文?还有其他方法吗?
public async void Test()
{
// This is in Thread 1
Foo foo = new Foo();
Context.context = "context1"; // This is ThreadStatic
string result = await foo.CallAsynx();
// This is most likely Thread 2
Context.context = "context1"; // This might be a different thread and so resetting context
}
如果我不想使用 ThreadStatic,现在还有其他方法吗?
【问题讨论】:
-
你真的需要线程
ThreadStatic吗?您可以通过CallContext.LogicalSetData/LogicalGetData流动您的全局状态变量:stackoverflow.com/q/22363830/1768303 -
或者您可以将其更改为
foo.CallAsynx(context);。这就是 ASP.NET MVC 的发展方向。 -
此外,异步不会创建新线程。我会选择保罗的方法。在 ASP.NET 上下文中,(线程)静态是不安全的,不同的请求在线程池中的线程上运行,因此(线程)静态变量将继续存在并在请求/用户之间共享
-
我想避免使用 ThreadStatic,这是问这个问题的原因:)。另外,需要考虑的一点是,如果 await 调用抛出异常,我输入的逻辑将不起作用
标签: c# async-await threadstatic