[英]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 = "";
}
....
}
建立服務器連接時,將創建reader
和writer
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.