我有一个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
声明。该方法只需要返回Task
或Task<T>
。
正如@Mayoor所提到的,ProcessMessage
中缺乏awaits
表明它正在进行同步工作,在这种情况下,它不应该是async
。将方法声明为async
不会使其异步,它只是允许您在其中使用await
来等待异步工作完成。
如果工作是同步的,您可以使用Task.Run
在后台运行它,您可以使用await
。所以一个可能的解决方案是让你的ProcessMessage
方法同步然后调用
await Task.Run(() => ProcessMessage(...));
您可以在本文中了解有关async-await
最佳实践的更多信息。