我如何等待异步完成?

时间:2014-03-02 18:05:37

标签: c# windows windows-8 winrt-xaml async-await

我目前正在开发一个聊天客户端(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));
    }

2 个答案:

答案 0 :(得分:2)

我建议您首先尽力使用TCP / IP。使用WebAPI,SignalR等

如果你 需要 来使用TCP / IP,那么你需要实现message framing,正如我在博客中描述的那样。

答案 1 :(得分: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...
}