.net 4.0 Try/Catch未捕获套接字异常

本文关键字:套接字 异常 Catch Try net | 更新日期: 2023-09-27 18:30:12

我有一个C#/WPF多线程应用程序,它向股票经纪人发出6个选项信息请求。六个线程中的五个线程正常完成并产生预期结果;但是,最后一个线程没有正常结束。如果我让它继续下去,我会得到一个"发生套接字异常"和一条消息:对话框中对WSACancelBlockingCall的调用中断了阻塞操作。所有这些请求都使用相同的代码,并且是重复的请求,除了请求不同日期的信息(请求中的Uri不同)。代码为:

try
{
    dynamic v_WebRequest = HttpWebRequest.Create ( v_Uri ) as HttpWebRequest;
    v_WebRequest = HttpWebRequest.Create ( v_Uri );
    v_WebRequest.Method = p_Method;
    v_WebRequest.Headers.Add ( "Authorization", v_OAuthHeader.ToString () );
    if ( p_Postdata != null )
    {
        v_WebRequest.ContentLength = p_Postdata.Length;
        v_WebRequest.ContentType = "application/x-www-form-urlencoded";
        using ( Stream v_RequestStream = v_WebRequest.GetRequestStream () )
        {
            dynamic v_bytes = System.Text.Encoding.UTF8.GetBytes ( p_Postdata );
            v_RequestStream.Write ( v_bytes, 0, v_bytes.Length );
        }
    }
    dynamic v_Response = v_WebRequest.GetResponse ();
    string v_ResponseText = null;
    Stream v_Reader = v_Response.GetResponseStream ();
    StreamReader readStream = new StreamReader ( v_Reader, Encoding.UTF8 );
    v_Reader = v_Response.GetResponseStream ();
    using ( v_Reader )
    {
        v_ResponseText = readStream.ReadToEnd ();
        v_Reader.Close ();
        v_Response.Close ();
    }
    return v_ResponseText;
}
catch ( IOException ex )
{
    Trace.WriteLine ( "TradeKingApi(Request): IOException: " + ex.InnerException.ToString () );
    return null;
}
catch ( Exception ex )
{
    Trace.WriteLine  ( "TradeKingApi(Request): non-IOexception: " + ex.InnerException.ToString() );
    return null;
}

"catch"块不会捕获异常。当异常发生时,调试器指向以下行:

                dynamic v_Response = v_WebRequest.GetResponse ();

我不知道该怎么办。如果我可以捕获异常,我可以通过向调用方返回null来允许程序继续,并且可以重新发出请求。

我确实有这个程序的非线程版本,它没有遇到同样的问题。。。每个请求都返回期望的数据。

也许将try/catch仅放在单个"v_WebRequest.GetResponse();"语句周围会有所帮助?

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

没有从社区得到任何东西,这就是我所做的:好吧,我在HttpWebRequest中添加了一个4秒的超时,这样应用程序就不会占用很长时间,在套接字异常时,我会向调用方发送一个null;我把Task.WetAny(taskArray)放在一个Try/Catch周围,然后在MainViewModel中捕获AggregateException和原始方法的return。有几件事在我脑海中引发了疑问:1.)为什么我必须按F5才能继续5次,然后它才能击中我的"接球"块?2.)为什么请求超时。。。六分之一,每次都是不同的?我确实修改了代码以删除"dynamic"类型,不知道为什么最初的作者可能会使用dynamic。我仍在寻求任何帮助,以进一步诊断超时以及为什么一个线程挂起。谢谢

.net 4.0 Try/Catch未捕获套接字异常

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