ac#ディクショナリで非同期タスクを参照する

石工

いくつかのプログラムで辞書の非同期タスクに関する問題に遭遇しましたが、それを解決する方法に頭を悩ませることはできません。

次のような非同期タスクがあります。

MessageEventArgs.Channel.SendMessage("somestring");

MessageEventArgs プログラムの開始時に静的に宣言するサードパーティライブラリのクラスです。

public static MessageEventArgs meargs;

プログラムはIRCチャネルでイベントをリッスンし、テキストコマンドに基づいてアクションを実行します。コマンドごとに巨大なswitchステートメントを用意するのではなく、文字列をメソッドに一致させる辞書を作成したかったのです。すべてが単にメッセージを送信しているわけではないので、送信する文字列を保存するだけでは不十分です。次のようになります。

public static Dictionary<string, Task> myDict= new Dictionary<string, Task>()
{
    {"!example", MessageEventArgs.Channel.SendMessage("HelloWorld") }
}

Main()で、私は次のように呼び出します。

MessageReceived += async (s,e) => 
{
     meargs = e;
     await myDict[e.Message.Text];
}

私が気付いたのは、辞書がインスタンス化されると、非同期タスクであるため、SendMessageを呼び出そうとすることです。MessageEventArgsは終了するまでインスタンス化されないため、例外がスローされます。これらの関数への参照を辞書に保存する方法はありますか?デリゲートを使用して解決策を見つけましたが、voidメソッドでは機能しないようで、async(私の知る限り)メソッドはvoidまたはを返すことしかできませんTask

前もって感謝します!

ブラッドリー・ウフナー

これを書いているとしたらIrcCommand、仮想ExecuteCommand関数使ってクラスを作成します。次に、実行したいすべての個別のコマンドのサブクラスを作成します。各サブクラスはExecuteCommand、コマンドを呼び出すために必要なロジックで関数をオーバーライドしますコマンドを呼び出すために、チャネルに対応するExecuteCommandタイプの引数を取ることができますChannel

起動時に、コマンドテキストの、およびそのコマンドを実装するサブクラスの新しいインスタンスのDictionary<string, IrcCommand>が入力されたKey作成しますValue

コマンドが入ってくるIrcCommandと、一致するキーを使用して辞書からインスタンスをプルし、そのExecuteCommand上で関数を呼び出しChannel、コマンドを受け取ったコマンドを渡します。


このようなことが起こる可能性があります。構文を確認するために実際にVisualStudioを開いていないので、ここでいくつかのエラーが発生する可能性があります。

いくつかのコマンドの実装:

public class ExampleCommand : IrcCommand
{
    public override void ExecuteCommand(Channel channel)
    {
        channel.SendMessage("Hello World");
    }
}

public class DisconnectCommand : IrcCommand
{
    public override void ExecuteCommand(Channel channel)
    {
        channel.Disconnect();
    }
}

アプリケーション開始時のコマンドの登録:

private void RegisterCommands()
{
    _commands.add("!example", new ExampleCommand());
    _commands.add("!disconnect", new DisconnectCommand());
}

受信時にコマンドを実行する:

_commands(commandText).ExecuteCommand(e.channel);

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

jquery Jsonの戻り値を使用してAC#ディクショナリを反復処理します

分類Dev

非同期コンテキストでディクショナリに追加するときのNullReferenceException

分類Dev

ac#コンストラクターでオプションのデリゲートを処理する最良の方法は何ですか?

分類Dev

ac#ディクショナリキーの先頭の数値はルックアップパフォーマンスを向上させますか?

分類Dev

ac#アプリケーションでAPIクレデンシャルを正しく保護する方法

分類Dev

ac#メソッド呼び出しを含むlinqリクエストを(非同期メソッドで)待機する方法

分類Dev

シーンスタートでac#スクリプトを1で実行する方法

分類Dev

ディクショナリオブジェクトに格納された非同期HttpGETタスク

分類Dev

リソースディクショナリを参照する正しい方法は何ですか?

分類Dev

React-Redux:非同期アクションと同期アクションをディスパッチする方法は?

分類Dev

非同期タスクからのデータでスピナーを更新する

分類Dev

非同期データをディスパッチアクションに渡して、アクションクリエーターで使用できるようにするにはどうすればよいですか?

分類Dev

同じソリューションでac#プロジェクトからc ++プロジェクトを参照する方法はありますか?

分類Dev

Json.net-ディクショナリにデータを入力するときにディクショナリ値の参照を保持する方法は?

分類Dev

wpfのリソースディクショナリでリンクされたスタイルを使用する

分類Dev

ディクショナリクラスタイプの参照変数に初期化されるオブジェクト参照は何ですか?

分類Dev

クラスのインスタンスであるディクショナリキー名を確認する

分類Dev

jestでredux非同期アクションクリエーターをテストする

分類Dev

Django-リクエスト間でパラメータディクショナリを保持する

分類Dev

KeyValueディクショナリデータを解析する方法

分類Dev

Oracleでデータディクショナリを更新する方法は?

分類Dev

Pythonで複数のデータディクショナリを連結する

分類Dev

リストの「ビッグデータ」ディクショナリで計算を並列化する方法は?

分類Dev

別の非同期アクションの結果に基づく複数の非同期アクションをディスパッチする方法は?

分類Dev

WPFでリソースディクショナリを使用する方法

分類Dev

キーでリソースディクショナリを使用する方法は?

分類Dev

SpotifyAPIリクエストからリストのディクショナリからデータを取得する

分類Dev

.NETでデータベースを非同期的にクエリする方法

分類Dev

node.jsのデータベースを非同期でクエリする

Related 関連記事

  1. 1

    jquery Jsonの戻り値を使用してAC#ディクショナリを反復処理します

  2. 2

    非同期コンテキストでディクショナリに追加するときのNullReferenceException

  3. 3

    ac#コンストラクターでオプションのデリゲートを処理する最良の方法は何ですか?

  4. 4

    ac#ディクショナリキーの先頭の数値はルックアップパフォーマンスを向上させますか?

  5. 5

    ac#アプリケーションでAPIクレデンシャルを正しく保護する方法

  6. 6

    ac#メソッド呼び出しを含むlinqリクエストを(非同期メソッドで)待機する方法

  7. 7

    シーンスタートでac#スクリプトを1で実行する方法

  8. 8

    ディクショナリオブジェクトに格納された非同期HttpGETタスク

  9. 9

    リソースディクショナリを参照する正しい方法は何ですか?

  10. 10

    React-Redux:非同期アクションと同期アクションをディスパッチする方法は?

  11. 11

    非同期タスクからのデータでスピナーを更新する

  12. 12

    非同期データをディスパッチアクションに渡して、アクションクリエーターで使用できるようにするにはどうすればよいですか?

  13. 13

    同じソリューションでac#プロジェクトからc ++プロジェクトを参照する方法はありますか?

  14. 14

    Json.net-ディクショナリにデータを入力するときにディクショナリ値の参照を保持する方法は?

  15. 15

    wpfのリソースディクショナリでリンクされたスタイルを使用する

  16. 16

    ディクショナリクラスタイプの参照変数に初期化されるオブジェクト参照は何ですか?

  17. 17

    クラスのインスタンスであるディクショナリキー名を確認する

  18. 18

    jestでredux非同期アクションクリエーターをテストする

  19. 19

    Django-リクエスト間でパラメータディクショナリを保持する

  20. 20

    KeyValueディクショナリデータを解析する方法

  21. 21

    Oracleでデータディクショナリを更新する方法は?

  22. 22

    Pythonで複数のデータディクショナリを連結する

  23. 23

    リストの「ビッグデータ」ディクショナリで計算を並列化する方法は?

  24. 24

    別の非同期アクションの結果に基づく複数の非同期アクションをディスパッチする方法は?

  25. 25

    WPFでリソースディクショナリを使用する方法

  26. 26

    キーでリソースディクショナリを使用する方法は?

  27. 27

    SpotifyAPIリクエストからリストのディクショナリからデータを取得する

  28. 28

    .NETでデータベースを非同期的にクエリする方法

  29. 29

    node.jsのデータベースを非同期でクエリする

ホットタグ

アーカイブ