当前位置:编程学习 > C#/ASP.NET >>

webclient在进行upstringassyc操作时都做了啥?

为了让访问网络不阻塞界面,以提高用户体验,我使用了异步网络请求。但有一个问题我百思不得解,故来此求教:

异步请求是正常的,执行之后,界面不会阻塞,点击拖动界面也不会出现“未响应”之类的话。但软件启动后,第一次发出联网请求时,却是阻塞的。我在webclient.uploadstringasync()语句执行前和后,以及提交完成的事件过程里都放了debug.now()来测试时间,发现就是第一次使用的时候,界面卡住约有6,7秒以上那样子,而事件返回的都只有1,两秒(正确返回)。

而我之前好像也遇到这个问题,并且在做应用时曾用封包监视工具查看,发现那阻塞的几秒时间里,并没用进行网络提交。也就是,webclient的第一次引用并不是立即的,我想清楚,它在干嘛,为什么阻塞,如何避免?

谢谢。 --------------------编程问答-------------------- 看你的结贴率,也不贴代码的。 --------------------编程问答--------------------
引用楼主 lovexwm 的回复:
而我之前好像也遇到这个问题,并且在做应用时曾用封包监视工具查看,发现那阻塞的几秒时间里,并没用进行网络提交。也就是,webclient的第一次引用并不是立即的,我想清楚,它在干嘛,为什么阻塞,如何避免?


WebClient 很无辜诶!

如果你是访问一个asp.net网站,你忍了吧。这是网站的毛病。 --------------------编程问答-------------------- “没有进行网络提交”?会不会是工具的问题呢?

如果你的测试程序刚刚开始执行,也有可能需要一点时间加载相关的dll。所有.net程序都有这个代价,第一次访问一个dll的时候都应该有一点延迟,不过6、7秒有点不可思议。

你试一试访问一个html文件,看看返回的快不快呢? --------------------编程问答-------------------- 是访问一个php页面。跟服务器器返回没关系。因为是异步请求,即使服务器返回很慢,那么这段时间,软件也是不会出现 “停止响应” 的状况。
只是在第一次发起联网时,很久很慢。其中拖动窗体就会发现软件卡住了。过会儿,才正常反应。之后便没用这问题。同样的一个按钮操作,一个访问php页面的过程,第二次按,便非常顺畅。即使时间两3秒,也不会出现窗体卡壳的情况。

回楼上:我监视的是请求发送,迟迟没用发送web请求,而这个时间里,软件界面处于阻塞状态...,即使使用异步方法
      代码因为觉得比较简单就没贴了。就在按钮过程里,创建一个webclient对象。然后调用upLoadStringASsyc方法,向一个uri提交一串字符。
      谢谢sp1234 --------------------编程问答-------------------- 我疑惑重点不是返回的慢。而是第一次连接网络时,的前几秒会使界面卡壳(准确计量超过10秒)。严重影响用户体验。而后再进行同样操作,就只有1~两秒,且界面不卡壳。如果这是不可避免的(对象首次使用需要加载什么),那么如何回避这个问题,以提高用户体验?比如在软件启动之后,进行预备性的网络访问,还是别的什么方法?我还是希望了解真正的原因。谢谢 --------------------编程问答-------------------- 啟動時檢查網絡狀態。
你不要異步,看看反應時間是多少。 --------------------编程问答-------------------- 调试跟踪看看卡在那句语句上,然后反编译进去看看代码 --------------------编程问答--------------------     Sub testnet()
        Dim n As New WebClient
        Debug.Print(Now)
        Debug.Print(n.DownloadString("http://www.baidu.com/"))
        Debug.Print(Now)
    End Sub
这个过程在窗体load事件里运行。返回:
2011/9/7 20:54:53
这行是返回的网页,我就不复制来了。
2011/9/7 20:55:07

由时间可以看出,相距14秒。而这段时间里,窗体还不能显示出来。在打印出第一个时间之后,就等待了很久,才打印出返回的网页和第二个时间。窗体也显示出来了。

从封包嗅探器里可以看到真正发送请求到返回网页的时间并不长,而是在请求之前,软件不知道卡娜了。真是疑惑...我现在可以在软件启动之后自动做一次网络连接。然后我要的在按钮事件里的的网络操作就不会出现卡壳的现象(因为总是第一次访问网络才会卡住一会)。但这也感觉方法太笨。也许这里面也有什么玄妙。希望高人指点。 --------------------编程问答-------------------- 10/09/2011 16:24:25
***页面代码。
10/09/2011 16:24:25
上面是两个时间。
可能是你电脑问题啦。或者是你网络问题。
你ping 一下百度。反应时间快慢。应该就知道是电脑问题,还是网络问题吧。 --------------------编程问答--------------------
  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        testnet()
    End Sub

    Sub testnet()
        Dim n As New Net.WebClient
        Debug.Print("start:" & Now)
        Dim siteUri As New Uri("http://www.baidu.com/")
        n.DownloadStringAsync(siteUri)
        AddHandler n.DownloadStringCompleted, AddressOf LoginEvent
        Debug.Print("end:" & Now)
    End Sub

    Private Sub LoginEvent(ByVal sender As Object, ByVal e As Net.DownloadStringCompletedEventArgs)
        Debug.Print("Completed:" & Now)
        Debug.Print(e.Result)
    End Sub

上面用异步方法,也很快啊。
start:10/09/2011 16:45:46
end:10/09/2011 16:45:46
Completed:10/09/2011 16:45:46
<!doctype html>****页面代码 --------------------编程问答--------------------
引用 10 楼 linjimu 的回复:
VB.NET code
  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        testnet()
    End Sub

    Sub testnet()
        Dim n As New Net.We……

感谢你的回复。
首先我说明我的测试仅仅是最简单的情况(一个带按钮的窗体和一个webclient对象),排除了其他代码因素引起的卡死问题。

我8楼的代码不是异步的,仅仅用webclient来下载一个网页。我试过多次,14秒,确切的14秒间隔。从第一个NOW到执行downstring之后的一个NOW,相差14秒。我非常想知道这是为什么。因为我的软件在这14秒的等待令人感到非常不愉快。
这14秒钟内,如果没有使用异步或另外开一个线程,那主界面绝对的反应为“未响应”。(出现在窗体标题上,时间没有14秒那么长,窗体处于卡死状。)
而即使使用异步或多线程,也仅仅解决窗体卡死的问题,软件无法迅疾启用网络连接。软件运行后的第一次联网,必须延迟14秒才得到返回。之后,每次联网都不需要1秒钟,最慢不超过3秒。
14秒....是什么概念....换成是一个网页,用户早就等得不耐烦了...

恳请大侠指点迷津! --------------------编程问答--------------------
以下是我直接复制你的代码进行的测试:

软件启动后的第一次按钮启动联网下载百度首页:
start:2011/9/16 20:24:58
end:2011/9/16 20:25:12
Completed:2011/9/16 20:25:12
<!doctype html>......

第二次按钮启动联网下载百度首页:
start:2011/9/16 20:26:19
end:2011/9/16 20:26:19
Completed:2011/9/16 20:26:19
<!doctype html>......

匪夷所思.... --------------------编程问答-------------------- 匪夷所思...
应该不是程序问题。是你电脑环境问题吧。比如安装什么pps类似的网络视频播放软件。
你用360看看谁在占用你的网络。 --------------------编程问答--------------------
引用 13 楼 linjimu 的回复:
匪夷所思...
应该不是程序问题。是你电脑环境问题吧。比如安装什么pps类似的网络视频播放软件。
你用360看看谁在占用你的网络。


那为什么是我软件第一次访问网络会这样?而且我传给别人,运行也是这样 --------------------编程问答-------------------- 我好像已经找到问题了,这真是个隐蔽的问题,在网上看到一篇问题一样的文章,原来是默认proxy开启的原因使联网处于proxy等待中。将proxy设为nothing就明显改善了我所描述的问题。
前几天我问的一个xml出错的问题也有异曲同工之处,就是某个属性的默认状态害死人了~
--------------------编程问答-------------------- http://blog.csdn.net/rrrfff/article/details/6170653

把答案博主帖子放这,方便后来人查询。 --------------------编程问答-------------------- 呵呵。你的vs版本是是不是2005的啊?
在10楼的代码也没有用:
Dim n As New Net.WebClient
n.Proxy = Nothing --------------------编程问答--------------------
引用 17 楼 linjimu 的回复:
呵呵。你的vs版本是是不是2005的啊?
在10楼的代码也没有用:
Dim n As New Net.WebClient
n.Proxy = Nothing


和vs的版本有关系还是和.net 库版本有关系???

如此来我还得升级vs了?纠结。。。我怕我电脑支持不住

不过目前,确实已经大大改善了这个问题。没有长时间等待了。 --------------------编程问答-------------------- 不是吧,你仍然是vs2003. --------------------编程问答--------------------
引用 16 楼 lovexwm 的回复:
http://blog.csdn.net/rrrfff/article/details/6170653

把答案博主帖子放这,方便后来人查询。


竟然有我的名字 --------------------编程问答--------------------
补充:.NET技术 ,  VB.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,