Недавно я читал об async / await и хотел бы знать, как обмениваться данными между разными потоками, принадлежащими к разным классам? Предположим, что у нас есть HttpContext
в каком-то веб-приложении. Этот контекст содержит информацию о userId
, sessionId
и так далее. Наше веб-приложение предоставляет некоторые данные, которые используются некоторым консольным приложением, которое выполняется на другом компьютере. Если в этом консольном приложении возникнут ошибки, я запишу это в файл журнала. userId
и sessionId
также должны записываться в этот файл журнала. Но каждый поток, созданный в этом консольном приложении, имеет свой собственный контекст. Итак, я ищу способ установить userId
и sessionId
в контекст потока. Я не хочу использовать какие-то статические классы или volatile
поля. Ниже я привел простой пример своего консольного приложения.
public sealed class MainService
{
/// <summary>
/// The main method which is called.
/// </summary>
public void Execute()
{
try
{
searchService.ExecuteSearchAsync().Wait();
}
catch (Exception e)
{
// gets additional info (userId, sessionId) from the thread context
StaticLoggerClass.LogError(e);
}
}
}
public sealed class SearchService
{
private IRepository repository = new Repository();
public async Task ExecuteSearchAsync()
{
try
{
var result = await this.GetResultsAsync();
}
catch (Exception e)
{
// gets additional info (userId, sessionId) from the thread context
StaticLoggerClass.LogError(e);
}
}
private async Task<ResultModel> GetResultsAsync()
{
var result = this.repository.GetAsync();
}
}
public sealed class Repository
{
private IClient client;
public async Task<Entity> GetAsync()
{
return await client.GetResultAsync();
}
}
searchService.ExecuteSearchAsync().Wait();
, что означает, что никакойawait
не может вернуть - person Panagiotis Kanavos   schedule 13.10.2017public void Execute()
и вызовWait()
. Метод должен быть асинхронным - person Panagiotis Kanavos   schedule 13.10.2017static
, который выполняет запись в файл журнала. Он используется в веб-приложении и консольном приложении. Он берет данные из контекста потока. ЭтоHttpContext
в веб-приложении. Но у меня нетuserId
иsessionId
в моем заявлении о соболезновании. Я думаю, что мне следует установить его в контексте для консольного приложения. - person Joseph Katzman   schedule 13.10.2017async/await
методов много. По механизмуasync/await
я не знаю, сколько потоков будет создано. Может я буду только одну ветку. Может быть нет. - person Joseph Katzman   schedule 13.10.2017