Я прочитал инструкции Microsoft по адресу Как выполнить несколько веб-запросов параллельно с помощью async и await (C #) и нашел:

private async Task CreateMultipleTasksAsync()  
{  
    // Declare an HttpClient object, and increase the buffer size. The  
    // default buffer size is 65,536.  
    HttpClient client =  
        new HttpClient() { MaxResponseContentBufferSize = 1000000 };  

    // Create and start the tasks. As each task finishes, DisplayResults   
    // displays its length.  
    Task<int> download1 =   
        ProcessURLAsync("http://msdn.microsoft.com", client);  
    Task<int> download2 =   
        ProcessURLAsync("http://msdn.microsoft.com/library/hh156528(VS.110).aspx", client);  
    Task<int> download3 =   
        ProcessURLAsync("http://msdn.microsoft.com/library/67w7t67f.aspx", client);  

    // Await each task.  
    int length1 = await download1;  
    int length2 = await download2;  
    int length3 = await download3;  

    int total = length1 + length2 + length3;  

    // Display the total count for the downloaded websites.  
    resultsTextBox.Text +=  
        string.Format("\r\n\r\nTotal bytes returned:  {0}\r\n", total);  
}  

Я понимаю этот код, но у меня вопрос: как мне изменить его, чтобы масштабировать, например, сотню или тысячу?

7
Buyo 2 Янв 2018 в 07:16

2 ответа

Лучший ответ

Вы можете вызывать асинхронные вызовы в цикле. Каждый вызов может вернуть задачу, и вам нужно дождаться завершения всех задач.

var requestInfoCollection = new RequestInfo[]
{
     new RequestInfo("http://url1","GET"),
     new RequestInfo("http://url2","GET"),
     new RequestInfo("http://url2","POST")
};
List<Task> tasks = new List<Task>();
foreach(var requestInfo in requestInfoCollection)
{
   tasks.Add(ProcessURLAsync(requestInfo))
}
Task.WaitAll(tasks);

Вышеупомянутое вызовет несколько запросов и ждет результатов, однако async \ await полезен для освобождения потока для приложения, которое будет использоваться при выполнении внешних вызовов (http, db и т. Д.). Но масштабирование зависит от вашего оборудования и архитектуры вашего приложения.

6
CreativeManix 2 Янв 2018 в 04:36

Я не могу комментировать из-за ограничений в моей учетной записи, но в ответ на ответ @ CreativeManix:

List<Task> tasks = new List<Task>();

Task.WaitAll(tasks) не примет Список задач. Одно из его переопределений принимает массив задач.

Task.WaitAll(tasks.ToArray())
11
batuzai04123 3 Авг 2018 в 04:23