静态方法&多线程问题

时间:2015-10-15 19:34:52

标签: c# multithreading

我知道静态方法并不总是线程安全的,但如果设计得当,它们是线程安全的,因为每次运行都会重新初始化内部变量......

下面是我在这里找到的一些代码,但它看起来是线程安全的,因为所有资源都在方法内部化。然而,当它试图释放资源时,它仍然会抛出一个空指针(我已经注释了这一行)。

 public static string XmlHttpRequest(string urlString, string xmlContent)
 {
     string response = null;
     HttpWebRequest httpWebRequest = null;//Declare an HTTP-specific implementation of the WebRequest class.
     HttpWebResponse httpWebResponse = null;//Declare an HTTP-specific implementation of the WebResponse class

     //Creates an HttpWebRequest for the specified URL.
     httpWebRequest = (HttpWebRequest)WebRequest.Create(urlString);

     try
     {
         byte[] bytes;

         bytes = System.Text.Encoding.ASCII.GetBytes(xmlContent);

         //Set HttpWebRequest properties
         httpWebRequest.Method = "POST";
         httpWebRequest.ContentLength = bytes.Length;
         httpWebRequest.ContentType = "text/xml; encoding='utf-8'";

         using (Stream requestStream = httpWebRequest.GetRequestStream())
         {
             //Writes a sequence of bytes to the current stream 
             requestStream.Write(bytes, 0, bytes.Length);
             requestStream.Close();//Close stream
         }

         //Sends the HttpWebRequest, and waits for a response.
         httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();

         if (httpWebResponse.StatusCode == HttpStatusCode.OK)
         {
             //Get response stream into StreamReader
             using (Stream responseStream = httpWebResponse.GetResponseStream())
             {
                 using (StreamReader reader = new StreamReader(responseStream))
                     response = reader.ReadToEnd();
             }
         }

         httpWebResponse.Close();//Close HttpWebResponse
     }
     catch (WebException we){}
     catch (Exception ex) { throw new Exception(ex.Message); }
     finally
     {
         httpWebResponse.Close();
         //Here is the null in the line above

         httpWebResponse = null;
         httpWebRequest = null;
     }

     return response;
 }

因此,由于httpWebResponse为null,我在代码中注释的行是抛出null。我假设它与使用此方法的线程有关。它只会发生在某些时候。

1 个答案:

答案 0 :(得分:1)

它与线程无关。在为 httpWebResponse分配值之前,您可能会收到异常。由于您正在吞咽任何WebException,因此httpWebResponse完全有可能在您不知道发生异常的情况下为空。

此外,您的其他异常处理程序仅在包含消息的情况下抛出 new vanilla异常。您将丢失所有其他信息,例如基本异常类型和堆栈跟踪。您可能只是重新抛出原始异常,但这与没有另一个catch块完全相同。

我会:

  • 删除catch块(或至少第二个)
  • httpWebResponse包装在using块中(如果抛出异常,它将自动关闭)。
  • 在调用httpWebResponse之前检查是否Close。 (请注意,如果你将它包装在一个使用中,你不必关闭它,所以你不必检查它是否为空)

此外,将httpWebResponsehttpWebRequest设置为null也是毫无意义的,因为一旦方法退出,它们就有资格进行垃圾回收。