私はそれを説明しようとする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;
}
}
}
- を使用したデータは、各クライアントの共同管理しますasyncronously nnection:
// 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