C# .net 4.0尝试/捕获未捕获套接字异常

C# .net 4.0尝试/捕获未捕获套接字异常,c#,wpf,multithreading,sockets,C#,Wpf,Multithreading,Sockets,我有一个C/WPF多线程应用程序,它向股票经纪人发出6个关于期权信息的请求。六条螺纹中有五条正常完成并产生预期结果;但是,最后一个线程不会正常结束。如果让它继续运行,则会出现套接字异常,并显示一条消息:对话框中对WSACancelBlockingCall的调用中断了阻塞操作。所有这些请求都使用相同的代码,并且都是重复的请求,除了在请求中请求来自不同日期和不同Uri的信息。 代码是: catch块不捕获异常。发生异常时,调试器将指向此行: dynamic v_Res

我有一个C/WPF多线程应用程序,它向股票经纪人发出6个关于期权信息的请求。六条螺纹中有五条正常完成并产生预期结果;但是,最后一个线程不会正常结束。如果让它继续运行,则会出现套接字异常,并显示一条消息:对话框中对WSACancelBlockingCall的调用中断了阻塞操作。所有这些请求都使用相同的代码,并且都是重复的请求,除了在请求中请求来自不同日期和不同Uri的信息。 代码是:

catch块不捕获异常。发生异常时,调试器将指向此行:

                dynamic v_Response = v_WebRequest.GetResponse ();
我不知道如何继续下去。如果我可以捕获异常,我可以通过向调用者返回null来允许程序继续,并且可以重新发出请求

我有一个非线程版本的程序,它不会遇到同样的问题…每个请求都返回预期的数据

可能仅将try/catch放在单个v_WebRequest.GetResponse上;声明会有帮助吗

我已尝试在调用例程中取消线程,但这不会取消挂起的线程。 任何关于进一步调试或允许继续的方法的想法都将不胜感激

没有从社区得到任何东西,这就是我所做的: 我加了4秒。HttpWebRequest超时,这样应用程序就不会占用很长时间,在套接字异常情况下,我向调用者发回一个空值;我将Task.WaitAnytaskArray放在MainViewModel中,它由Try/Catch和aggregateeexception组成,并从原始方法返回。有几件事让我产生了疑问: 1.为什么我必须按F5才能在它撞到我的挡块之前继续5次? 2.为什么请求超时…6次中有1次,每次都不同? 我确实更改了代码以删除动态类型,但不知道最初的作者为什么会使用动态。 我仍然在寻求任何帮助,以进一步诊断超时以及为什么一个线程挂起。
谢谢。

为了完成这篇文章并发布我自己的答案,我提供以下内容: 1.通过将请求的KeepAlive设置为false(默认为true),修复了原始超时和套接字异常。这消除了原来的问题; 2.catch块实际上看到了异常,但在它出现之前,我不得不在调试器中多次点击F5。 3.从动态类型更改为var或HttpWebRequest与这两个问题都无关。是的,我使用了其他人编写的东西,并没有对每一行代码都提出质疑,但我敢说,为了完成工作而这样做的人要多得多。
4.实际上,我通过使用一个名为Fiddler的优秀web诊断程序发现了超时的解决方案——如果您还不知道,请查看它。

为什么要对其中一些变量使用dynamic?特别是v_字节看起来很奇怪。John,你可能混淆了var和dynamic关键字。var的类型是在编译时推断出来的,而在运行时是动态的。只需将dynamic替换为var即可。如果您不知道dynamic的作用,则不应该使用它。它增加了不必要的开销,消除了程序的编译时验证。当您说catch块没有捕获异常时,您是否在catch块中设置了断点来验证这一点?或者您依赖于缺少控制台输出?好吧,您正在接受异常,那么您希望发生什么呢?
                dynamic v_Response = v_WebRequest.GetResponse ();