我有一个C#Windows应用商店应用,在任务中运行的streamsocket侦听器等待命令通过网络进入。在完成下一个命令之前,我需要确保每个命令都已完全处理。
侦听器接收原始消息并执行
await ProcessMessage(message);
是
private async Task ProcessMessage(string message, string optionalFlags = "")
解析消息并调用许多方法之一,即
ProcessCommandXYZ(parameters);
这似乎有效,但在异步任务ProcessMessage行中,我得到一个CS1998“异步方法缺少'await'”警告,并且搜索说如果你收到此消息,你可能没有正确使用异步。
我的方法是否正确,我可以忽略此警告,还是有更好的方法来做到这一点?
更新 的
我意识到我的很多问题是其中一个方法是更新绑定到listview的状态,所以它在UI调度程序中并使它不同步而我正在等待它的ProcessCommandABC()。因为它只是一种方法,我相信如果最好并且不等待一种方法我可以优化吗?
答案 0 :(得分:2)
使用async
的目的是为了在该函数/方法中使用关键字await
。因为ProcessMessage
方法在其中没有进行任何等待,所以编译器会向您发出警告。解决方案很简单:从async
中删除ProcessMessage
。调用者使用await
并不要求使用async
声明它调用的方法。该方法只需返回Task
或Task<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()
最佳做法的详情。