本文介绍了StreamSocket,DataWriter.StoreAsync(),DataReader.LoadAsync() - 异步问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建一个双赢8商店应用中,我连接到​​服务器,用Java编写的,使用StreamSocket。当我运行StreamSocket.ConnectAsync(...),DataWriter.StoreAsync()在调试应用程序,具有断点,DataReader.LoadAsync(...),它连接,发送消息,并收到一个消息发回。但是,一旦我删除我的断点的任何一项,方法并不做的工作。我如何能解决这个问题?这里是我的code:

 公共异步连接无效()
{
    尝试
    {
        等待socket.ConnectAsync(新Windows.Networking.HostName(IP)
            50000,SocketProtectionLevel.PlainSocket);
        连接= TRUE;
    }
    赶上(例外五)
    {
        如果(SocketError.GetStatus(e.HResult)== SocketErrorStatus.Unknown)
        {
            扔;
        }        Windows.UI.Popups.MessageDialog MD =
            新Windows.UI.Popups.MessageDialog(错误:+ e.Message);
        返回;
    }
    返回;}公共异步无效握手()
{
    尝试
    {        //输出
        作家=新DataWriter(socket.OutputStream);
        writer.Uni codeEncoding =
             Windows.Storage.Streams.Uni codeEncoding.Utf8;        字节[] = nameBytes Encoding.UTF8.GetBytes(Name.ToCharArray());
        writer.WriteBytes(nameBytes);
        等待writer.StoreAsync();        等待writer.FlushAsync();
        writer.DetachStream();
        writer.Dispose();
        //输入
        读者=新的DataReader(socket.InputStream);
        reader.InputStreamOptions = InputStreamOptions.Partial;
        reader.Uni codeEncoding = Windows.Storage.Streams.Uni codeEncoding.Utf8;        UINT信息bytesAvailable =等待reader.LoadAsync(4096);
        字节[] = byArray新的字节[方bytesAvailable]
        reader.ReadBytes(byArray);
        字符串TEMP = Encoding.UTF8.GetString(byArray,0,
            Convert.ToInt32(参考bytesAvailable));        TEMP = temp.Substring(0,temp.Length - 1);        如果(临时==NAME OK)
        {
            GoodName = TRUE;
        }        reader.DetachStream();
        reader.Dispose();
    }
    赶上(例外五)
    {
        //等待Task.WhenAll(tasks.ToArray());
        如果(SocketError.GetStatus(e.HResult)== SocketErrorStatus.Unknown)
        {
            扔;
        }        Windows.UI.Popups.MessageDialog MD =
            新Windows.UI.Popups.MessageDialog(错误:+ e.Message);
        md.ShowAsync();
    }
}


解决方案

我改变了connect()以任务的返回类型。然后把它称为正因为如此,等待连接(); 我把收发code在不同的方法和做了同样的。我的问题是一个异步的问题,这个固定它。

I'm creating a Win 8 store app in which I connect to a server, written in Java, using StreamSocket. When I run the app in debug, with breakpoints on StreamSocket.ConnectAsync(...), DataWriter.StoreAsync(), and DataReader.LoadAsync(...), it connects, sends the message, and receives a message back. However, once I remove any one of my breakpoints, that method doesn't do it's job. How can I can fix this issue? Here is my code:

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();
    }
}
解决方案

I changed the return type of Connect() to Task. Then called it as such, await Connect(); I put send and receive code in separate methods and did the same. My issue was an asynchronous problem and this fixed it.

这篇关于StreamSocket,DataWriter.StoreAsync(),DataReader.LoadAsync() - 异步问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

11-02 14:12