いくつかのプログラムで辞書の非同期タスクに関する問題に遭遇しましたが、それを解決する方法に頭を悩ませることはできません。
次のような非同期タスクがあります。
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]
コメントを追加