簡體   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