【问题标题】:C# Windows Phone 8.1 GetOutputStreamAsync(...) blocking after first useC# Windows Phone 8.1 GetOutputStream Async(...) 首次使用后阻塞
【发布时间】:2015-09-21 06:18:04
【问题描述】:

我目前正在尝试创建一个非常基本的测试应用程序,它应该:

1) 在端口“1234”上广播“sometext”
2) 等待答案
3) 返回所有答案

虽然下面发布的解决方案首次运行良好,但随后的每个调用都将永远阻塞:
stream = await socket.GetOutputStreamAsync(...)

到目前为止,我尝试了所有可能的清理方法(因为那是我认为失败的地方),甚至将所有内容都包装在 using(...) 语句中。

模拟器以及使用 Windows Phone 8.1 的硬件设备会出现问题


提前致谢!


开始“发现”的代码:

private void Button_Click(object sender, RoutedEventArgs e)
{
    PluginUDP pudp = new PluginUDP();
    var task = pudp.scan("asf");
    task.Wait();
    foreach (string s in task.Result)
        output.Text += s + "\r\n";            
}

“发现”本身的代码:

using System;
using Windows.Networking;
using Windows.Networking.Sockets;
using Windows.Storage.Streams;
using System.Text;
using System.IO;
using System.Threading.Tasks;
using System.Collections.Concurrent;

using namespace whatever
{
    public class PluginUDP
    {
        private static readonly HostName BroadcastAddress = new HostName("255.255.255.255");
        private static readonly string BroadcastPort = "1234";
        private static readonly byte[] data = Encoding.UTF8.GetBytes("00wlan-ping00");

        ConcurrentBag<string> receivers;        

        public async System.Threading.Tasks.Task<string[]> scan(string options)
        {
            receivers = new ConcurrentBag<string>();
            receivers.Add("ok");

            DatagramSocket socket = null;
            IOutputStream stream = null;
            DataWriter writer = null;

            try
            {
                socket = new DatagramSocket();                
                socket.MessageReceived += MessageReceived;

                await socket.BindServiceNameAsync("");

                stream = await socket.GetOutputStreamAsync(BroadcastAddress, BroadcastPort);
                writer = new DataWriter(stream);               

                writer.WriteBytes(data);
                await writer.StoreAsync();

                Task.Delay(1000).Wait();                
            }
            catch (Exception exception)
            {
                receivers.Add(exception.Message);
            }
            finally
            {
                if (writer != null)
                {
                    writer.DetachStream();
                    writer.Dispose();
                }

                if(stream != null)
                    stream.Dispose();

                if(socket != null)
                    socket.Dispose();
            }

            return receivers.ToArray(); ;
        }

        private async void MessageReceived(DatagramSocket socket, DatagramSocketMessageReceivedEventArgs args)
        {
            try
            {
                var result = args.GetDataStream();
                var resultStream = result.AsStreamForRead(1024);

                using (var reader = new StreamReader(resultStream))
                {
                    var text = await reader.ReadToEndAsync();
                    if (text.Contains("pong"))
                    {
                        receivers.Add(args.RemoteAddress.ToString());
                    }
                }
            }
            catch (Exception exception)
            {
                receivers.Add("ERRCV");
            }
        }
    }
}

【问题讨论】:

    标签: c# windows-phone-8.1 udp async-await broadcast


    【解决方案1】:

    你的问题从这里开始:

    task.Wait();
    

    You're blocking on async code,这会导致您进入僵局。

    你想要:

    private async void Button_Click(object sender, RoutedEventArgs e)
    {
        PluginUDP pudp = new PluginUDP();
        string[] result = await pudp.scan("asf");
        foreach (string s in result)
            output.Text += s + "\r\n";            
    }
    

    你也想做:

    await Task.Delay(1000);
    

    代替:

    Task.Delay(1000).Wait();  
    

    【讨论】:

      猜你喜欢
      • 2017-10-12
      • 1970-01-01
      • 2023-04-03
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      相关资源
      最近更新 更多