我正在制作一个在线通信应用程序,我想异步处理消息。我发现异步等待模式在实现消息循环时很有用。
以下是我到目前为止所得到的:
CancellationTokenSource cts=new CancellationTokenSource(); //This is used to disconnect the client.
public Action<Member> OnNewMember; //Callback field
async void NewMemberCallback(ConnectionController c, Member m, Stream stream){
//This is called when a connection with a new member is established.
//The class ConnectionController is used to absorb the difference in protocol between TCP and UDP.
MessageLoop(c, m,stream,cts.Token);
if(OnNewMember!=null)OnNewMember(m);
}
async Task MessageLoop(ConnectionController c, Member m, Stream stream, CancellationToken ct){
MemoryStream msgbuffer=new MemoryStream();
MemoryStream buffer2=new MemoryStream();
while(true){
try{
await ReceiveandSplitMessage(stream, msgbuffer,buffer2,ct); //This stops until data is received.
DecodeandProcessMessage(msgbuffer);
catch( ...Exception ex){
//When the client disconnects
c.ClientDisconnected(m);
return;
}
}
}
然后我收到一些警告,说在 NewMemberCallback 中,不等待对 MessageLoop 的调用。我实际上不需要等待 MessageLoop 方法,因为该方法在连接断开之前不会返回。像这样使用异步是否被认为是一种好习惯?我听说不等待异步方法不好,但我也听说我应该消除不必要的等待。或者将异步模式用于消息循环甚至被认为是不好的?