如何在C#中对一个Web服务并行发出多个请求
本文关键字:并行 服务 Web 请求 一个 | 更新日期: 2023-09-27 18:28:45
我需要调用以下3个WCF服务,
var client = new WebClient();
client.Headers[HttpRequestHeader.ContentType] = "application/json";
var resultJson1 = client.UploadString("http://localhost:45868/Product/GetAvailableProductsByContact",
jsonser1);
var resultJson2= client.UploadString("http://localhost:45868/Product/GetMemberProductsByContact",
jsonser2);
var resultJson3= client.UploadString("http://localhost:45868/Product/GetCoachProductsByContact",
jsonser3);
这需要花费大量时间才能获得结果并显示在页面上。有人能帮我如何并行执行它们吗?
您可以使用任务并行库:
Task<string>[] taskArray = new Task<string>[]
{
Task.Factory.StartNew(() => {
var client = new WebClient();
client.Headers[HttpRequestHeader.ContentType] = "application/json";
var json = client.UploadString("http://localhost:45868/Product/GetAvailableProductsByContact",
jsonser1);
return json;
}),
Task.Factory.StartNew(() => {
var client = new WebClient();
client.Headers[HttpRequestHeader.ContentType] = "application/json";
var json = client.UploadString("http://localhost:45868/Product/GetMemberProductsByContact",
jsonser2);
return json;
}),
Task.Factory.StartNew(() => {
var client = new WebClient();
client.Headers[HttpRequestHeader.ContentType] = "application/json";
var json = client.UploadString("http://localhost:45868/Product/GetCoachProductsByContact",
jsonser3);
return json;
}),
};
// the request for .Result is blocking and waits until each task
// is completed before continuing; however, they should also all
// run in parallel instead of sequentially.
var resultJson1 = taskArray[0].Result;
var resultJson2 = taskArray[1].Result;
var resultJson3 = taskArray[2].Result;
或者,由于您的请求都非常相似,只是url和上传字符串不同,因此您可以使用LINQ AsParallel
数组处理:
var requests = new [] {
new { Url = "http://localhost:45868/Product/GetAvailableProductsByContact", Input = jsonser1 },
new { Url = "http://localhost:45868/Product/GetMemberProductsByContact", Input = jsonser2 },
new { Url = "http://localhost:45868/Product/GetCoachProductsByContact", Input = jsonser3 },
};
var result = requests.AsParallel().Select(req => {
var client = new WebClient();
client.Headers[HttpRequestHeader.ContentType] = "application/json";
var json = client.UploadString(req.Url, req.Input);
return json;
}).ToArray();
// when above code has finished running, all tasks are completed
var resultJson1 = result[0];
var resultJson2 = result[1];
var resultJson3 = result[2];
您可以使用开始/结束模式:
这个例子展示了如何并行调用两个ws。您可以将此想法扩展到N个服务。
尝试创建一个执行每个调用的Task
(MSDN)
你可以尝试做以下
首先为您的每个呼叫创建一个Task<String>
var client = new WebClient();
client.Headers[HttpRequestHeader.ContentType] = "application/json";
Task<String> task1 = Task.Factory.StartNew(() => {
client.UploadString("http://localhost:45868/Product/GetAvailableProductsByContact",
jsonser1);
});
冲洗并重复其他2个
之后,您可以通过调用task1.Value
、task2.Value
和task3.Value
来加入3个Task<String>
的执行,这将返回一个String