Как сделать несколько запросов параллельно веб-сервису в C # - PullRequest
1 голос
/ 23 марта 2012

Мне нужно позвонить в 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);

Это займет много времени, чтобы получить результаты и отобразить на странице. Может кто-нибудь помочь мне, как я мог выполнить их параллельно?

Ответы [ 3 ]

5 голосов
/ 23 марта 2012

Вы можете использовать библиотеку параллелизма задач :

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-адресом и строкой загрузки, вы можете использовать LINQAsParallel обработка массива:

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];
1 голос
/ 23 марта 2012

Вы можете использовать шаблон начало / конец:

В этом примере показано, как вызвать два w в параллели.Вы можете распространить идею на N услуг.

0 голосов
/ 23 марта 2012

Попробуйте создать 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

После этого вы можете присоединиться к выполнению 3 Task<String>, вызвав task1.Value, task2.Value и task3.Value, что вернет String

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...