【发布时间】:2016-01-15 04:30:46
【问题描述】:
我现在在几个程序的字典中遇到了关于异步任务的问题,我不知道如何解决它。
我有一个如下所示的异步任务:
MessageEventArgs.Channel.SendMessage("somestring");
MessageEventArgs 是我在程序开始时静态声明的第 3 方库中的一个类:
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。
提前致谢!
【问题讨论】:
-
您在初始化 myDict 时是否尝试过“新建”SendMessage 实例?
-
您确定应该将
MessageEventArgs保留为像这样的静态变量吗?它的名字让我觉得它是EventArgs的子类,每次事件发生时都会发送给你。我从来没有真正遇到过将它们作为长期存在的实例保留是个好主意的情况。 -
@JustinR.我没试过,但我会试一试。
-
@BradleyUffner 实际上,你是对的。完全错过了。我会摆脱它并找到另一种方式来调用 SendMessage
-
任务的“动作”签名——即任务实际执行的方法——是否对所有任务都相同?如果有,请分享。
标签: c# async-await task