2014-03-02 199 views
1

我目前正在开发一个聊天客户端(Windows应用商店应用程序--C#),目前我暂时停留在注册部分。在将相关数据(如用户名,密码,电子邮件等)发送到服务器以创建新用户之前,我调用函数“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_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对象的创建:

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

编辑:我也当我有同样的问题尝试登录(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)); 
    } 
+1

你不“等”(或至少,你不应该)。你“等待” - 就像你已经是。 –

+0

那么我怎么解决我的问题呢? – Paytime

+0

请提供关于'reader'和'writer'对象的更多细节。那些如何以及在哪里创建的? – YK1

回答

0

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

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

    await writer.FlushAsync(); 

    // ..rest of code... 
} 
+0

它仍然无法正常工作:/ – Paytime

+0

并且在2次尝试后工作?尝试在服务器上刷新。 – YK1

+0

是的,它是一样的。它只在第二次尝试后才起作用。 – Paytime

2

我建议你先尽最大努力使用TCP/IP。使用的WebAPI,SignalR等

如果你需要使用TCP/IP,那么你就需要实现message framing,因为我描述我的博客上。