使用WebResponse在当前程序/问题中实现任务

我已经为我当前的程序实现了任务,但在那之后我有一些问题试图处理。 让我向您展示整个第一个应用程序 – 没有实现任务实现,并在修改后锁定catch以及我对此新版本有什么问题。 请注意,旧的工作正常。

应用程序的第一个版本(如果您需要更多代码,请询问)

namespace SOAP_testing { class Program { .................. static void Main(string[] args) { Console.WriteLine("Starting the program at: " + DateTime.Now); //Create Server Server SAMaddress= new Server { ServerIP = @"http://10.134.211.11:5673/xmlrequest/" }; ....... //Synchronized way <----------------------------------------------------------- Execute(READYTOTEST, DONEFILE, item.LSPPathName, IO.TimeOutFP, SAMaddress); ................. Console.WriteLine("Ends " + i + " from" + inventory.Count); ........... Console.WriteLine("Ending the program at: " + DateTime.Now); } //Create a soap webrequest to [Url] public static HttpWebRequest CreateWebRequest(string ServerIP) { HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(ServerIP); webRequest.Headers.Add(@"SOAP:Action"); webRequest.ContentType = "text/xml;charset=\"utf-8\""; webRequest.Accept = "text/xml"; webRequest.Method = "POST"; return webRequest; } public static void Execute(string xmlFileRequest, string xmlFileResult, string InventoryElement, string TimeOutFile, Server server) { HttpWebRequest request = CreateWebRequest(server.ServerIP); var soapEnvelopeXml = new XmlDocument(); soapEnvelopeXml.Load(xmlFileRequest); using (Stream stream = request.GetRequestStream()) { soapEnvelopeXml.Save(stream); } try { using (WebResponse response = request.GetResponse()) { using (var rd = new StreamReader(response.GetResponseStream())) { string soapResult = rd.ReadToEnd(); var xdoc = new XmlDocument(); xdoc.LoadXml(soapResult); xdoc.Save(xmlFileResult); } } } catch (WebException e) { using (StreamWriter sw = File.AppendText(TimeOutFile)) { sw.WriteLine(InventoryElement); } } } ............... } 

第二个应用程序 – 我只留下了大部分代码,我做了一些更改

  ....... namespace SOAP_testing { class Program { static object locker = new object(); <----------locker added ................ public class MakeRequest { public string file_READYTOTEST { get; set; } public string file_DONEFILE { get; set; } public string Inventory_name { get; set; } public string TimeOutFP { get; set; } public Server server { get; set; } } static void Main(string[] args) { .................. var makeRequestList = new List(); int i = 0; foreach (var item in inventory) { i++; //Place inventory item to file .._READYTOTEST and save it in Output directory PutElementToLspPingTest(IO.LSPReqTemplFP, IO.OutputDir, item.LSPPathName, IO.TimeOutFP); string file = item.LSPPathName; file = file.Remove(0, 4); string READYTOTEST = IO.OutputDir + file + "_READYTOTEST" + ".xml"; string DONEFILE = IO.OutputDir + file + "_DONE" + ".xml"; makeRequestList.Add(new MakeRequest { file_DONEFILE = DONEFILE, file_READYTOTEST = READYTOTEST, Inventory_name = file, server = SAMaddress, TimeOutFP = IO.TimeOutFP } ); } // NEW - task implementation List mytasks = new List(); foreach (MakeRequest item in makeRequestList) { Task myFirstTask = Task.Factory.StartNew(() => Execute(item.file_READYTOTEST, item.file_DONEFILE, item.Inventory_name, IO.TimeOutFP, item.server) ); mytasks.Add(myFirstTask); } Task.WaitAll(mytasks.ToArray()); Console.WriteLine("Ends " + i + " from" + inventory.Count); ..... } ..... public static void Execute(string xmlFileRequest, string xmlFileResult, string InventoryElement, string TimeOutFile, Server server) { HttpWebRequest request = CreateWebRequest(server.ServerIP); var soapEnvelopeXml = new XmlDocument(); soapEnvelopeXml.Load(xmlFileRequest); using (Stream stream = request.GetRequestStream()) { soapEnvelopeXml.Save(stream); } try { using (WebResponse response = request.GetResponse()) { using (var rd = new StreamReader(response.GetResponseStream())) { string soapResult = rd.ReadToEnd(); var xdoc = new XmlDocument(); xdoc.LoadXml(soapResult); xdoc.Save(xmlFileResult); } } } catch (WebException e) { lock (locker) <-----locker added { using (StreamWriter sw = File.AppendText(TimeOutFile)) { sw.WriteLine(InventoryElement); } } } catch (Exception ex) { } } ....................... } } } 

第二版中的差异是我为Execute方法的每个请求创建的任务,并添加了对使用内部catch的锁定。

我收到的错误是在Execute方法中

using (Stream stream = request.GetRequestStream())

错误消息:操作已超时(Webexception已超时)。

请注意,在第一个应用程序中,我有时间,但在不同的行:

 using (WebResponse response = request.GetResponse()) 

和它的确定因为我知道特定元素在服务器上没有响应然后我把它拿到TimeOut文件中。 在完成任务之后,我不知道发生了什么。 总结第一个应用程序工作正常,如预期第二个不。 你能支持吗?