我知道静态方法并不总是线程安全的,但如果设计得当,它们是线程安全的,因为每次运行都会重新初始化内部变量......
下面是我在这里找到的一些代码,但它看起来是线程安全的,因为所有资源都在方法内部化。然而,当它试图释放资源时,它仍然会抛出一个空指针(我已经注释了这一行)。
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。我假设它与使用此方法的线程有关。它只会发生在某些时候。
答案 0 :(得分:1)
它与线程无关。在为 httpWebResponse
分配值之前,您可能会收到异常。由于您正在吞咽任何WebException
,因此httpWebResponse
完全有可能在您不知道发生异常的情况下为空。
此外,您的其他异常处理程序仅在包含消息的情况下抛出 new vanilla异常。您将丢失所有其他信息,例如基本异常类型和堆栈跟踪。您可能只是重新抛出原始异常,但这与没有另一个catch
块完全相同。
我会:
catch
块(或至少第二个)httpWebResponse
包装在using
块中(如果抛出异常,它将自动关闭)。 httpWebResponse
之前检查是否Close
。 (请注意,如果你将它包装在一个使用中,你不必关闭它,所以你不必检查它是否为空)此外,将httpWebResponse
和httpWebRequest
设置为null也是毫无意义的,因为一旦方法退出,它们就有资格进行垃圾回收。