Я использую код C# для отправки Xml в конечную точку api и захвата ответа Как я это делаю У меня есть папка A со 100 xmls, папка B со 100 Xmls и папка C со 100 xmlsC# - Task.WaitAll() не ждет завершения всей задачи
Я прокручиваю каждую из папок и в каждой итерации цикла создаю задачу. Позволяет называть это как задачу папки
Задача папки перемещается по всему xml в каждой папке и фиксирует ответ. Это выполняется в методе sendrequestandcaptureresponse()
Проблема, с которой я сталкиваюсь, представляет собой конец цикла перед обработкой всех xmls. Метод sendrequestandcaptureresponse() запускается для всех 300 XMLS (который находится в папке A, B и C), но я получаю ответ только за 150 (приблизительно) XMLS
Task.WaitAll (tasklist) завершает работу перед ожиданием всех XML-запросов ответы
Вы можете найти код ниже
кодекса перебрать папку
foreach(Folder in Folders){
Task t=Task.Factory.StartNew(
async() =>
{
Httpmode.RunRegressionInHTTPMode(folderPath);
}
}).Unwrap();
tasklist.Add(t);
}
Task.WaitAll(tasklist.ToArray());
код, который отправляет запрос и улавливает г esponse
public void RunRegressionInHTTPMode(folderPath){
try
{
string directoryPath = CurrServiceSetting.GetDirectoryPath();
var filePaths = CreateBlockingCollection(folderPath+"\\Input\\");
int taskCount = Int32.Parse(CurrServiceSetting.GetThreadCount());
var tasklist = new List<Task>();
for (int i = 0; i < taskCount; i++)
{
var t=Task.Factory.StartNew(
async () =>
{
string fileName;
while (!filePaths.IsCompleted)
{
if (!filePaths.TryTake(out fileName))
{
continue;
}
try{
SendRequestAndCaptureResponse(fileName,CurrServiceSetting,CurrSQASettings,testreportlocationpath);
}
catch(Exception r)
{
Console.WriteLine("#####SOME Exception in SendRequestAndCaptureResponse "+r.Message.ToString());
}
}
}).Unwrap();
tasklist.Add(t);
}
Task.WaitAll(tasklist.ToArray());
}
catch(Exception e)
{
}
}
Может ли кто-нибудь указать мне, что мне не хватает здесь. Я поставил задачу как задачу async и добавил метод Unwrap в конце задачи, но все еще не смог дождаться завершения всей задачи.
Любая помощь будет отличной.
Заранее спасибо
Добавление кода SendRequestAndCaptureResponse ниже
public void SendRequestAndCaptureResponse(string fileName,ServiceSettings curServiceSettings,SQASettings CurrSQASettings,string testreportlocationpath){
XmlDocument inputxmldoc = new XmlDocument ();
Stream requestStream=null;
byte[] bytes;
DateTime requestsenttime=DateTime.Now;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create (url);
string responseStr = "";
bytes = Encoding.ASCII.GetBytes (str4);
try{
request.ContentType = "text/xml; encoding='utf-8'";
request.ContentLength = bytes.Length;
Credentials credentials = new Credentials();
request.Credentials = new NetworkCredential (CurrSQASettings.GetUserName(), CurrSQASettings.GetPassword());
request.Method = "POST";
request.Timeout = Int32.Parse(curServiceSettings.GetTimeOut());
//OVERRIDING TIME
requestsenttime=DateTime.Now;
requestStream = request.GetRequestStream ();
requestStream.Write (bytes, 0, bytes.Length);
requestStream.Close ();
}
catch(Exception e){
return;
}
HttpWebResponse response;
try
{
response = (HttpWebResponse)request.GetResponse ();
if (response.StatusCode == HttpStatusCode.OK)
{
allgood = true;
Stream responseStream = response.GetResponseStream ();
responseStr = new StreamReader (responseStream).ReadToEnd ();
XmlDocument xml = new XmlDocument ();
xml.LoadXml (responseStr);
xml.Save(resultantactualxmlpath);
response.Close();
responseStream.Close();
}
}
catch(Exception e){
return;
}
}
спасибо Glorin. В этом случае, пожалуйста, сообщите, какую возвращаемую стоимость он ожидает. Любые указатели будут полезны. –
Не ожидайте методов/делегатов void: https://msdn.microsoft.com/en-us/magazine/jj991977.aspx –
Что произойдет, если вы выбросите; вместо возврата; в этой последней функции вы добавили? Мне кажется, вы скрываете потенциальные ошибки. –