我使用 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
希望这对您有所帮助,或者至少指出一个好的方向。