繁体   English   中英

如何等待异步完成?

[英]How do I wait for an async to complete?

我目前正在使用聊天客户端(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 reader对象:

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));
    }

我建议您首先尽最大努力使用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...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM