Dotnetcore中父线程和子线程之间的数据流



我正在努力维护.NET Core web应用程序中父线程与其子线程之间的数据。

其中我需要存储父线程的web应用程序名称和web请求URL,并需要在其子线程开始执行时使用它。即使父线程在其子线程开始执行之前完成了执行,我也需要维护父数据。我尝试过Execution Context、Sync Local、Thread Local/static来维护父线程和子线程之间的数据,但没有帮助。

  1. 有人能建议在.NET Core中维护父线程与其子线程之间数据的方法吗
  2. 在.NET Framework中,我找到了CallContext.LogicalSetData()CallContext.LogicalGetData(),但.NET Core不支持Call Context

有人能在.Net Core中为我们推荐一种替代方法吗
System.Runtime.Remoting.Messaging==>类调用上下文

提前感谢。

您的问题更多的是一种观点/方法,而不是一个技术问题。这是我能回答的最好的答案。

进程间通信(IPC(非常棘手。

这个想法是你有一个在单向/双向工作的共享对象。

考虑producer/consumer模式。考虑Redis缓存。

强语句警报。阅读/申请风险自负/理解

  1. 我建议远离线程。如果您正在编写操作系统,则只应在.NET中创建线程:(在所有其他情况下,您应该使用async/await
  2. 此外,如果这有助于解决IPC,请尝试在ConcurrentQueue<T>中进行拟合。它们都转换为消息代理模式
  3. 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...
}

相关内容

  • 没有找到相关文章

最新更新