gpt4 book ai didi

multithreading - 如何在ASP .NET Core请求管道中仍具有未完成的子线程的同时停止线程重用?

转载 作者:行者123 更新时间:2023-12-03 12:59:25 24 4
gpt4 key购买 nike

我有一个使用以下中间件在请求管道上设置了自定义执行上下文的webapi:

public async Task Invoke(HttpContext httpContext)
{
using (Context.With(new TokenContext("token")))
{
await _next(httpContext);
}
}

上下文管理器看起来像这样,带有一堆 IContext对象,这些对象位于当前线程(及其创建的线程)的本地。
public static class Context
{
private static AsyncLocal<Stack<IContext>> _current = new AsyncLocal<Stack<IContext>>();
public static IContext Current
{
get
{
return _current.Value != null && _current.Value.Count > 0 ?_current.Value.Peek() : null;
}
}

public static IDisposable With(IContext context)
{
Assert.IsNotNull(context);

if (_current.Value == null) _current.Value = new Stack<IContext>();
_current.Value.Push(context);

return new DelegateDisposable(() =>
{
_current.Value.Pop();
});
}
}

我遇到的问题是同时执行多个请求时。有时,我在当前背景下出现的问题并非我所期望的。我注意到,在使用using语句设置当前上下文之前,当前上下文有时已经具有一个值。我的结论是,命中 await _next行时,用于请求的初始线程将返回到线程池,并且该线程可以/可以重复用于后续请求,有时会在“子线程”完成之前发生。这给我留下了很多不可预测的行为。

所以,我的问题是:我该如何进行调整,以免遇到此问题?是否可以在所有“子线程”完成之前强制请求管道不返回线程?这会效率低下吗?我可以强制“母线程”在将自身返回到池之前清理对上下文堆栈的引用吗?

还有其他选择吗?

最佳答案

the documentation根本不是显而易见的,但从the types stored in AsyncLocal<T> should be immutable来看却很明显。

这应该可以解决您的问题(使用 ImmutableStack from NuGet):

public static class Context
{
private static AsyncLocal<ImmutableStack<IContext>> _local = new AsyncLocal<ImmutableStack<IContext>>();
private static ImmutableStack<IContext> Value => _local.Value ?? ImmutableStack<IContext>.Empty;
public static IContext Current
{
get
{
var value = Value;
return value.IsEmpty ? null : value.Peek();
}
}

public static IDisposable With(IContext context)
{
Assert.IsNotNull(context);

_local.Value = Value.Push(context);

return new DelegateDisposable(() =>
{
_local.Value = Value.Pop();
});
}
}

关键是所有修改(push和pop)都必须设置 AsyncLocal<T>.Value。可以使用常规的 Stack<T>完成此操作,但是使用 ImmutableStack<T>可以强制使用正确的语义。

关于multithreading - 如何在ASP .NET Core请求管道中仍具有未完成的子线程的同时停止线程重用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45242816/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com