首页新闻找找看学习计划

仍然提问。await async偶尔死在readasync上是何道理?(源码已精简)

0
悬赏园豆:60 [已解决问题] 解决于 2014-09-15 07:38

代码精简过了。网速慢的时候就死掉了。我刻意找了个国外网站。并且开着迅雷下东西。

  async void button1_Click(object sender, EventArgs e)
        {
            while (!exit)
            {
                try
                {
                    var req = WebRequest.CreateHttp("http://www.cn431.com/cmvejhe/");// as HttpWebRequest;
                    using (var res = await req.GetResponseAsync() as HttpWebResponse)
                    {
                        using (var ms = new MemoryStream())
                        {
                            using (var stream = res.GetResponseStream())
                            {
                                //await stream.CopyToAsync(ms);//.Timeout(TimeSpan.FromMilliseconds(RWTimeout),"获取数据超时");
                                System.Diagnostics.Trace.WriteLine("read");
                                byte[] buffer = new byte[1024];
                                int count = 0;
                                while (0 < (count = await stream.ReadAsync(buffer, 0, buffer.Length)))
                                {
                                    //int count = await stream.ReadAsync(buffer, 0, buffer.Length);
                                    /*if (count == 0)
                                    {
                                        return;
                                    }*/
                                    System.Diagnostics.Trace.WriteLine("write" + count.ToString());
                                    await ms.WriteAsync(buffer, 0, count);
                                }
                                //  bytes= ms.ToArray();
                            }
                        }
                    }

                }
                catch (Exception ex) { }
            }
        }


大家以一试。Trace.WriteLine write后。在下一次读之后。程序没任何反映了。也不卡界面

gnhao的主页 gnhao | 初学一级 | 园豆:9
提问于:2013-07-16 12:48
< >
分享
最佳答案
0

这个真不行。

(HttpWebResponse)webrequest.GetResponse();

这个流只有一次操作的机会,如果想多次操作先复制到内存,所以就出现了上述的错误。

收获园豆:60
````` | 专家六级 |园豆:14268 | 2013-07-16 15:42

不是太懂你的意思。。。这个死是偶尔死。不是每次死。我好像明白你的一次机会是什么意思。这个是网络流。还没断开。可以while读取的。上边await stream.CopyToAsync(ms)被我注释掉了的。

gnhao | 园豆:9 (初学一级) | 2013-07-16 15:47

@gnhao: 是可以用while读取,但是并不是想的那样。

一般都是

do
  {
    byte[] buf = new byte[1024];
    count = stream.Read(buf, 0, 1024);
    ms.Write(buf, 0, count);
  } while(stream.CanRead && count > 0);
  b = ms.ToArray();

楼主还是去掉await,选择基础的方法来编写这些东西吧。

````` | 园豆:14268 (专家六级) | 2013-07-16 16:02

@imfunny: 不能遇到问题就缩回来啊。呵呵。我改了一下。目前程序跑的很欢。初步怀疑是死锁。

gnhao | 园豆:9 (初学一级) | 2013-07-16 16:09

@gnhao: 这个倒也不是,主要异步的编程本来就带有很强的不可预知性,所以如果没有熟练的掌握,项目里一般持有保留的态度。谢谢其他项目倒可以去尝试。毕竟也带来了更多的方便。

````` | 园豆:14268 (专家六级) | 2013-07-16 16:21
其他回答(1)
0
        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            while (true)
            {
                try
                {
                    var req = WebRequest.CreateHttp("http://www.cn431.com/cmvejhe/");
                    using (var res = await req.GetResponseAsync() as HttpWebResponse)
                    {
                        using (var ms = new MemoryStream())
                        {
                            using (var stream = res.GetResponseStream())
                            {
                                byte[] buffer = new byte[1024];
                                int count = 0;
                                while (0 < (count = await stream.ReadAsync(buffer, 0, buffer.Length)))
                                {
                                    ms.Write(buffer, 0, count);
                                }
                            }
                            resultsTextBox.Text += String.Format("\r\nStream Length: {0}.\r\n", ms.Length);
                        }
                    }

                }
                catch (Exception ex) {
                    resultsTextBox.Text += String.Format("\r\nException: {0}.\r\n", ex);
                }
            }
        }

再简化一下应该是这样吧,运行了一下,网络慢的时候就是慢了,但是没发现死的问题。

天边彩云 | 园豆:629 (小虾三级) | 2013-07-16 17:28

哈哈。我也头痛。因为这个问题是的出现有不确定性。所以也不好找错。有时候一个小时。有时候几分钟才出现这个问题。我用超时来解决这问题。再不行只能换成同步。

支持(0) 反对(0) gnhao | 园豆:9 (初学一级) | 2013-07-16 17:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册