0

我正在尝试在 .NET Core Web 应用程序中维护父线程及其子线程之间的数据。

我需要在其中存储父线程的 Web 应用程序名称和 Web 请求 URL,并且需要在其子线程开始执行时使用它。即使父线程在其子线程开始执行之前完成其执行,我也需要维护父数据。我尝试过执行上下文、同步本地、线程本地/静态来维护父线程和子线程之间的数据,但没有帮助。

  1. 任何人都可以建议在 .NET Core 中维护父线程及其子线程之间的数据的方式/方式。
  2. 在 .NET Framework 中,我找到了CallContext.LogicalSetData()and CallContext.LogicalGetData(),但 .NET Core 不支持Call Context.

任何人都可以在.Net Core 中向我们建议一种替代方法吗?
System.Runtime.Remoting.Messaging==> 类 CallContext

提前致谢。

4

2 回答 2

0

您是否尝试过使用AsyncLocal?在我的一个库( .NET 核心和 .NET Framework 都使用的.NET 标准 2.0)中,我使用这个对象来做你需要的事情——在同一个执行上下文中共享数据(也跨多个线程)

在下面的示例中(在我的控制器中 - .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...
}
于 2021-04-20T10:39:33.400 回答
0

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

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

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

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

强烈的声明警报。阅读/申请需要您自担风险/理解

  1. 我建议远离线程。如果您正在编写操作系统,您应该只在 .NET 中创建线程 :) 在所有其他情况下,您应该使用 .NET async/await
  2. ConcurrentQueue<T>另外,如果这有助于解决 IPC ,请尝试安装。它们都转化为消息代理模式。
  3. TaskCompletionSource是促进 IPC 的另一个不错的策略。
于 2021-04-16T06:05:27.750 回答