2015-09-23 41 views
0

我有一个C#Windows Store应用程序,其中有一个在等待命令通过网络进入的任务中运行的streamsocket侦听器。在做下一个命令之前,我需要确保每个命令都已完全处理。使用异步按顺序处理命令,不等待警告

监听器需要一个原始消息,并做

await ProcessMessage(message); 

这是

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

,它解析该消息并调用的许多方法中的一种,即

ProcessCommandXYZ(parameters); 

这似乎工作,但在异步任务ProcessMessage线我得到一个CS1998“异步方法缺乏'等待'”警告,一nd搜索说,如果您收到此消息,则说明您可能没有正确使用异步。

我的方法是否正确,我可以忽略此警告吗?还是有更好的方法来做到这一点?

更新

我认识了很多我的问题是方法之一是更新它绑定到一个列表视图的状态,所以这是在UI调度,使之不同步和我正在等待它的ProcessCommandABC()。既然这只是一种方法,我相信我可以优化,如果这是最好的,不要等待一种方法?

回答

2

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

2

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

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

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

您可以在此article了解async-await最佳实践。

+0

也许我问的是错误的问题,我已经更新了主帖 - 真正的问题是调度员导致命令失序 – Jason