我如何等待asynchronous完成?

我目前正在聊天客户端(Windowsapp store应用程序 – C#),我目前卡在注册部分。 在将相关数据(如用户名,密码,电子邮件等)发送到服务器以创build新用户之前,我调用函数“CheckSignUp(…)”,该函数首先检查用户名是否已经存在。 它首先发送关键字/ F011 /然后用户名,​​然后我应该收到关键字OK或NOK(用户名已存在)。 代码如下:

public async Task<string> CheckSignUp(string username) { writer.WriteString("/F011/" + "\n"); writer.WriteString(username + "\n"); await writer.StoreAsync(); reader.InputStreamOptions = InputStreamOptions.Partial; string result = reader.ReadString(await reader.LoadAsync(3)); return result; } 

按下“注册”button时会调用此function。 问题是只有在第二次按下“注册”button后才会出现错误。 以下是Button_click事件的相关代码:

 private async void bnSignUp_Click(object sender, RoutedEventArgs e) { ... string ValidUser = await App.ChatConnection.CheckSignUp(tbUserName.Text); if (ValidUser == "NOK") { FailText.Children.Add(new InfoTextBox("Error! Username already exists.")); tbUserName.Text = ""; } .... } 

readerwriter reader对象的创build在连接到服务器时发生:

 socket = new StreamSocket(); HostName hostname = new HostName(host); await socket.ConnectAsync(hostname, port); writer = new DataWriter(socket.OutputStream); reader = new DataReader(socket.InputStream); 

编辑:我也有同样的问题,当我尝试login(login()函数工程类似的CheckSignUp之一):

 public async Task<string> Login(string username, string password) { writer.WriteString("/F050/" + "\n"); writer.WriteString(GetHash(password) + "\n"); writer.WriteString("\n"); writer.WriteString(username + "\n"); await writer.StoreAsync(); reader.InputStreamOptions = InputStreamOptions.Partial; return reader.ReadString(await reader.LoadAsync(3)); } 

我建议你首先尽量不要使用TCP / IP。 使用WebAPI,SignalR等

如果你确实需要使用TCP / IP,那么你需要实现消息框架 ,就像我在博客上描述的那样。

您可能需要刷新写入器,以便您的数据实际上通过套接字发送,而不是缓冲。

 public async Task<string> CheckSignUp(string username) { writer.WriteString("/F011/" + "\n"); writer.WriteString(username + "\n"); await writer.StoreAsync(); await writer.FlushAsync(); // ..rest of code... }