я реализовал систему сеанса для моего приложения клиент-сервер с помощью AsyncLocal Постараюсь объяснить:
При запуске каждый клиентский обработчик подключения асинхронно:
- создать класс провести сеанс данных с использованием AsyncLocal
public class Session
{
private static AsyncLocal<IDictionary<string,object>> _Data = new AsyncLocal<Dictionary<string,object>>();
public static IDictionary Data
{
set
{
_Data.Value = value;
}
get
{
return _Data.Value;
}
}
}
- Управление каждого клиента сотрудничества асинхронном ть соединение:
// fire the client manager and go to keep listening for client connections.
Task manager = Task.Run(async() => await Client.Start())
- Назначают данные сеанса в новый словарь:
public async Task Start()
{
Session.Data = new Dictionary<string,object>();
// Do your receive, manage the bytes, etc.
}
Таким образом, Session.Data будет уникальным на этой асинхронной задачи и суб задач, даже если они является статическим свойством.
В качестве примера:
Session.Data = new Dictionary<string,object>() {{"value", 1}}
Console.WriteLine(Session.Data["value"].toString()); // will be 1
Task manager1 = Task.Run(async() =>
{
Console.WriteLine(Session.Data["value"].toString()); // will be 1
Session.Data = new Dictionary<string,object>() {{"value", 2}}
Console.WriteLine(Session.Data["value"].toString()); // will be 2
Task manager2 = Task.Run(async() =>
{
Console.WriteLine(Session.Data["value"].toString()); // will be 2
Session.Data = new Dictionary<string,object>() {{"value", 3}}
Console.WriteLine(Session.Data["value"].toString()); // will be 3
}
Task manager3 = Task.Run(async() =>
{
Console.WriteLine(Session.Data["value"].toString()); // will be 2
Session.Data = new Dictionary<string,object>() {{"value", 4}}
Console.WriteLine(Session.Data["value"].toString()); // will be 4
}
Console.WriteLine(Session.Data["value"].toString()); // will be 2
}
Console.WriteLine(Session.Data["value"].toString()); // will be 1
Надеется, что это помогает или, по крайней мере точкам на правильное направление.
Обычно у BOT-фреймворков есть функции управления сессиями, я думаю. Вы должны смотреть на это скорее на управление сеансом в своем хост-приложении. – Developer