У меня нет опыта веб-программирования и асинхронных c запросов. Я написал приведенный ниже код на основе примеров Microsoft. NET do c. Цель этого кода - нагрузить веб-службу SOAP и получить показатели того, сколько одновременных запросов она может поддерживать. Я запускаю этот код в нескольких потоках одновременно. Проблема в том, что когда один из потоков достигает webRequest.BeginGetResponse()
, он блокирует другие, пока этот вызов не будет завершен. Затем, когда этот вызов завершается в упомянутом потоке, второй поток случайным образом выполняет webRequest.BeginGetResponse()
, блокируя другие, и так далее. Таким образом, цель нагрузки на веб-службу несколькими вызовами одновременно не достигается, потому что запросы выполняются последовательно.
Как мне изменить код для поддержки цели?
String foto_a = Imagenes[2 * id].imageBase64;
String foto_b = Imagenes[2 * id + 1].imageBase64;
if (foto_a != null && foto_b != null)
{
XmlDocument soapEnvelopeXml = new XmlDocument();
soapEnvelopeXml.LoadXml(String.Format(@"
<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/""
xmlns:tem=""http://tempuri.org/""
xmlns:ent=""http://schemas.datacontract.org/2004/07/API.Entities"">
<soapenv:Header/>
<soapenv:Body>
<tem:Match>
<tem:faceImageA><ent:Image>{0}</ent:Image></tem:faceImageA>
<tem:faceImageB><ent:Image>{1}</ent:Image></tem:faceImageB>
</tem:Match>
</soapenv:Body>
</soapenv:Envelope>
", foto_a, foto_b));
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(_url);
webRequest.Headers.Add("SOAPAction", _action);
webRequest.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(
ASCIIEncoding.ASCII.GetBytes(username + ":" + password)));
webRequest.ContentType = "text/xml;charset=UTF-8";
webRequest.Accept = "text/xml";
webRequest.Method = "POST";
webRequest.ProtocolVersion = HttpVersion.Version11;
using (Stream stream = webRequest.GetRequestStream())
{
soapEnvelopeXml.Save(stream);
}
DateTime timer = DateTime.Now;
// begin async call to web request.
IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null);
// suspend this thread until call is complete. You might want to
// do something usefull here like update your UI.
asyncResult.AsyncWaitHandle.WaitOne();
// get the response from the completed web request.
WebResponse webResponse = webRequest.EndGetResponse(asyncResult);
DateTime elapsed = DateTime.Now.Subtract(timer).TotalMilliseconds;
// Process web response
}