簡體   English   中英

StreamSocket,DataWriter.StoreAsync(),DataReader.LoadAsync()-異步問題

[英]StreamSocket, DataWriter.StoreAsync(), DataReader.LoadAsync() — Asynchronous problems

我正在創建一個Win 8商店應用程序,其中使用StreamSocket連接到用Java編寫的服務器。 當我在調試中運行應用程序時,在StreamSocket.ConnectAsync(...),DataWriter.StoreAsync()和DataReader.LoadAsync(...)上具有斷點,它會連接,發送消息並接收回消息。 但是,一旦我刪除了任何一個斷點,該方法就不會起作用。 如何解決此問題? 這是我的代碼:

public async void Connect()
{
    try
    {
        await socket.ConnectAsync(new Windows.Networking.HostName(ip),
            "50000", SocketProtectionLevel.PlainSocket);
        Connected = true;
    }
    catch (Exception e)
    {
        if (SocketError.GetStatus(e.HResult) == SocketErrorStatus.Unknown)
        {
            throw;
        }

        Windows.UI.Popups.MessageDialog md =
            new Windows.UI.Popups.MessageDialog("Error: " + e.Message);
        return;
    }
    return;

}

public async void HandShake()
{
    try
    {

        //output
        writer = new DataWriter(socket.OutputStream);
        writer.UnicodeEncoding = 
             Windows.Storage.Streams.UnicodeEncoding.Utf8;

        byte[] nameBytes = Encoding.UTF8.GetBytes(Name.ToCharArray());
        writer.WriteBytes(nameBytes);
        await writer.StoreAsync();

        await writer.FlushAsync();
        writer.DetachStream();
        writer.Dispose();


        //input
        reader = new DataReader(socket.InputStream);
        reader.InputStreamOptions = InputStreamOptions.Partial;
        reader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;

        uint bytesAvailable = await reader.LoadAsync(4096);
        byte[] byArray = new byte[bytesAvailable];
        reader.ReadBytes(byArray);
        string temp = Encoding.UTF8.GetString(byArray, 0,
            Convert.ToInt32(bytesAvailable));

        temp = temp.Substring(0, temp.Length - 1);

        if (temp == "NAME OK")
        {
            GoodName = true;
        }

        reader.DetachStream();
        reader.Dispose();
    }
    catch (Exception e)
    {
        //await Task.WhenAll(tasks.ToArray());
        if (SocketError.GetStatus(e.HResult) == SocketErrorStatus.Unknown)
        {
            throw;
        }

        Windows.UI.Popups.MessageDialog md =
            new Windows.UI.Popups.MessageDialog("Error: " + e.Message);
        md.ShowAsync();
    }
}

默認情況下, LoadAsync在所有請求的字節均已讀取之前不會阻塞。 您可能會收到部分消息。

正如我在博客中所述,您將需要實現協議使用的任何類型的消息框架

PS避免async void 這確實使您的錯誤處理復雜化。

我將Connect()的返回類型更改為Task。 然后這樣調用, await Connect(); 我將發送和接收代碼放在單獨的方法中,並且執行了相同的操作。 我的問題是一個異步問題,此問題已得到解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM