使用async按顺序处理命令,没有等待警告



我有一个c# Windows Store应用程序,它有一个流套接字监听器,在一个等待命令通过网络进入的任务中运行。在执行下一个命令之前,我需要确保每个命令都被完全处理。

监听器接收原始消息并执行

await ProcessMessage(message);

private async Task ProcessMessage(string message, string optionalFlags = "")

解析消息并调用多个方法中的一个,即

ProcessCommandXYZ(parameters);

这似乎是有效的,但在异步任务ProcessMessage行我得到一个CS1998"异步方法缺乏'await'"警告,搜索说,如果你得到这个消息,你可能没有正确使用异步。

我的方法是正确的吗?我可以忽略这个警告吗?还是有更好的方法?

更新

我意识到我的很多问题是其中一个方法是更新绑定到listview的状态,所以它在一个UI调度程序中,使它不同步,我正在等待它的ProcessCommandABC()。因为它只是我认为我可以优化的一个方法,如果它是最好的,不等待一个方法?

使用async的目的是使您可以在该函数/方法中使用关键字await。因为ProcessMessage方法没有在里面做任何等待,编译器会给你这个警告。解决方案很简单:从ProcessMessage中移除async。调用者使用await并不要求它调用的方法必须用async声明。该方法只需要返回TaskTask<T>

正如@Mayoor所提到的,ProcessMessage中缺乏awaits表明它正在进行同步工作,在这种情况下,它不应该是async。将方法声明为async不会使其异步,它只是允许您在其中使用await来等待异步工作完成。

如果工作是同步的,您可以使用Task.Run在后台运行它,您可以使用await。所以一个可能的解决方案是让你的ProcessMessage方法同步然后调用

await Task.Run(() => ProcessMessage(...));

您可以在本文中了解有关async-await最佳实践的更多信息。

相关内容

最新更新