我正在努力维护.NET Core web应用程序中父线程与其子线程之间的数据。
其中我需要存储父线程的web应用程序名称和web请求URL,并需要在其子线程开始执行时使用它。即使父线程在其子线程开始执行之前完成了执行,我也需要维护父数据。我尝试过Execution Context、Sync Local、Thread Local/static来维护父线程和子线程之间的数据,但没有帮助。
- 有人能建议在.NET Core中维护父线程与其子线程之间数据的方法吗
- 在.NET Framework中,我找到了
CallContext.LogicalSetData()
和CallContext.LogicalGetData()
,但.NET Core不支持Call Context
有人能在.Net Core中为我们推荐一种替代方法吗System.Runtime.Remoting.Messaging
==>类调用上下文
提前感谢。
您的问题更多的是一种观点/方法,而不是一个技术问题。这是我能回答的最好的答案。
进程间通信(IPC(非常棘手。
这个想法是你有一个在单向/双向工作的共享对象。
考虑producer/consumer
模式。考虑Redis
缓存。
强语句警报。阅读/申请风险自负/理解
- 我建议远离线程。如果您正在编写操作系统,则只应在.NET中创建线程:(在所有其他情况下,您应该使用
async/await
- 此外,如果这有助于解决IPC,请尝试在
ConcurrentQueue<T>
中进行拟合。它们都转换为消息代理模式 TaskCompletionSource
是促进IPC的另一个很好的策略
您尝试过使用AsyncLocal吗?在我的一个库(.NET标准2.0,它被.NET核心和.NET Framework使用(中,我使用这个对象来做你需要做的事情——在同一执行上下文中共享数据(也跨多个线程(
在我下面的例子中(在我的控制器-.NET Core 3.1模板中,无论是控制器(,你都可以看到,即使在响应到达客户端之后,数据仍然是完整的
private static readonly AsyncLocal<string> SharedData = new AsyncLocal<string>();
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
SharedData.Value = "SharedData";
Console.WriteLine($"Shared data in main thread = {SharedData.Value}");
// Output: 'Shared data in main thread = SharedData'
Task.Factory.StartNew(() =>
{
Task.Delay(5_000).Wait();
Console.WriteLine($"Shared data in delayed task = {SharedData.Value}");
// Output: Shared data in delayed task = SharedData
});
// Additional code...
}