2016-12-24 8 views
0

私は電報ボットのためのコンソールアプリケーションを開発しています。コンソールアプリケーションのようなもの

私は、ユーザーから頼まれるべきか、フィールドアプリケーションに伝えるNextFiledStrigを持っています。複数のユーザーがボットまたはアプリケーションと通信している場合は、NextFiledStrigがすべて変更されます。私は、各ユーザのためにそれにNextFiledStrigを保存することができますので

は、セッションのようなものはありますか?あるいは、私はデータベースからその価値を何度も得なければなりませんか?

私はASP.netのC#を働いたと私は、アプリケーションをコンソールに新たなんです。

私は多くのことを探索したが、私はすべての事は私の問題を解決する見つけることができませんでした。多くの人が答えました。コンソールアプリケーションです。ユーザーは1人しかいないので、セッションは必要ありません。

+1

通常、BOTフレームワークのセッション管理機能があります。あなたはそれを見て、ホストアプリケーションのセッション管理に向かうべきです。 – Developer

答えて

1

コンソールアプリケーションにはセッションがありません。ただし、単純な辞書を使用してデータを保存することができます。

private static Dictionary<User, NextFiledStrig> s_nextFiledByUser = new Dictionary<User, NextFiledStrig>(); 

private static GetNextFiledForUser(User user) { 
    NextFiledStrig value; 
    bool isCached = s_nextFiledByUser.TryGetValue(user, out value); 
    if (!isCached) { 
     value = new NextFiledStrig(); //Replace this with the code that will get the value 
     nextFiledByUser.Add(user, value); 
    } 
    return value; 
} 
+0

私はデータベースが最良の解決策だと思います。アプリケーションがクラッシュまたは閉じる可能性があるためです。 –

+2

@MahdiHesariの場合、これらの値をAppDataフォルダのファイルに保存することができます。 –

+1

@KimHoang、あなたはマルチスレッドに対処する必要があります(と私は電報のボットは、異なるスレッドからのコマンドを処理する必要がありますと仮定)ときに、データベースを使用すると、あなたの人生はずっと楽になります –

1

コンソールアプリケーションのみを使用する必要がある場合は、思わないでください。そのようなものはありません。データベースを使用してキーの値を格納することはできます。しかし、このボットがどのようにユーザーから呼び出されるのか教えてください。

+0

には、各ボットに固有のボットトークンがあります。 –

+0

これはウェブアプリからのものでしょうか? –

+0

詳細情報[here](https://core.telegram.org/bots/api) –

0

私はそれを説明しようとする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 

が、これは、あなたや良い方向に少なくともポイントをお役に立てば幸いです。

関連する問題