Поток данных между родительским и дочерним потоками в Dotnetcore
Я пытаюсь поддерживать данные между родительскими и дочерними потоками в веб-приложениях .NET Core.
где мне нужно сохранить имя веб-приложения и URL-адрес веб-запроса родительского потока, и мне нужно использовать его, когда его дочерний поток начинает выполнение. Даже если родительский поток завершает свое выполнение до того, как его дочерний поток начинает свое выполнение, мне нужно поддерживать родительские данные. Я пробовал Контекст выполнения, Локальную синхронизацию, Локальный / статический поток для сохранения данных между родительскими и дочерними потоками, и это не помогло.
- Может ли кто-нибудь предложить способ / способы сохранения данных между родительским и его дочерними потоками в .NET Core.
- В .NET Framework я нашел
CallContext.LogicalSetData()
а такжеCallContext.LogicalGetData()
, но .NET Core не поддерживаетCall Context
.
Может ли кто-нибудь предложить нам альтернативный подход для этого в .Net Core?
System.Runtime.Remoting.Messaging
==> класс CallContext
Заранее спасибо.
2 ответа
Вы пробовали использовать 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...
}
Ваш вопрос - это скорее мнение / подход, чем техническая проблема. Вот лучшее, что я могу на него ответить.
Межпроцессное взаимодействие (IPC) очень сложно.
Идея в том, что у вас есть общий объект, который работает в одном / двух направлениях.
Рассмотреть возможность
producer/consumer
шаблон. Рассмотреть возможность
Redis
кеш.
Сильное предупреждение о заявлении. Прочтите / примените на свой страх и риск / с пониманием
- Я бы посоветовал отказаться от использования нитей. Создавать потоки в .NET следует только в том случае, если вы пишете операционную систему :) Во всех остальных случаях следует использовать
async/await
. - Также попробуйте вписаться
ConcurrentQueue<T>
если это поможет решить IPC. Все они соответствуют модели брокера сообщений. -
TaskCompletionSource
еще одна хорошая стратегия для облегчения IPC.