我目前正在开发一个聊天客户端(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 = "";
}
....
}
当连接到服务器是由发生reader
和writer
对象的创建:
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));
}
你不“等”(或至少,你不应该)。你“等待” - 就像你已经是。 –
那么我怎么解决我的问题呢? – Paytime
请提供关于'reader'和'writer'对象的更多细节。那些如何以及在哪里创建的? – YK1