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

时间:2015-09-23 02:51:13

标签: c# asynchronous async-await

我有一个C#Windows应用商店应用,在任务中运行的streamsocket侦听器等待命令通过网络进入。在完成下一个命令之前,我需要确保每个命令都已完全处理。

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

await ProcessMessage(message);

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

解析消息并调用许多方法之一,即

ProcessCommandXYZ(parameters);

这似乎有效,但在异步任务ProcessMessage行中,我得到一个CS1998“异步方法缺少'await'”警告,并且搜索说如果你收到此消息,你可能没有正确使用异步。

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

更新

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

2 个答案:

答案 0 :(得分:2)

使用async的目的是为了在该函数/方法中使用关键字await。因为ProcessMessage方法在其中没有进行任何等待,所以编译器会向您发出警告。解决方案很简单:从async中删除ProcessMessage。调用者使用await并不要求使用async声明它调用的方法。该方法只需返回TaskTask<T>

答案 1 :(得分:2)

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

如果作品是同步的,您可以使用Task.Run await在后​​台运行它,ProcessMessage。因此,一种可能的解决方案是使await Task.Run(() => ProcessMessage(...)); 方法同步,然后调用

async-await

您可以在此article了解有关app = wx.App() frame = wx.Frame(None, -1, '') box = wx.StaticBox(frame, -1, "") sizer = wx.StaticBoxSizer(box, orient=wx.HORIZONTAL) text = wx.StaticText(frame, label="Some Text") sizer.Add(text, wx.ALIGN_LEFT|wx.ALL, border=10) main_sizer = wx.BoxSizer(wx.VERTICAL) main_sizer.Add(sizer) frame.SetSizer(main_sizer) frame.Centre() frame.Show() text.SetFocus() print 'text.HasFocus?', text.HasFocus() app.MainLoop() 最佳做法的详情。

相关问题