Как запускать задачи async параллельно в c #? [Дубликат]

Натурально единственный способ - создать элемент , а затем имитировать щелчок, к сожалению.

Там крошечный плагин (бесстыдный плагин), который избавит вас от необходимости делать все это время: файл-диалог

fileDialog()
    .then(file => {
        const data = new FormData()
        data.append('file', file[0])
        data.append('imageName', 'flower')

        // Post to server
        fetch('/uploadImage', {
            method: 'POST',
            body: data
        })
    })

1
задан dace 28 April 2016 в 07:04
поделиться

6 ответов

Я думаю, что это то, что вы ищете:

var tasks = new Task<MyMethodReturnObject>[3];
tasks[0] = GetFirstListFilesAsync();
tasks[1] = GetSecondListFilesAsync();
tasks[2] = GetThirdListFilesAsync();

// At this point, all three tasks are running at the same time.

// Now, we await them all.
await Task.WhenAll(tasks);

// Get an individual result, where result is MyMethodReturnObject
var myText = tasks[0].Result;

// Loop through results
var results = tasks.Select(o => o.Result).ToList();
foreach (var result in results)
{
    Console.Write(result);
}

Источник: http://blog.stephencleary.com/2012/02/async-and-await.html

4
ответ дан jondow 15 August 2018 в 17:56
поделиться
  • 1
    Хорошо, но как я могу назначить результаты спискам, используя это? – dace 28 April 2016 в 07:46
  • 2
    Мой синтаксис может быть немного отключен здесь, так как у меня нет доступа к VS прямо сейчас, но что-то вроде: code var results = tasks.Select (o = & gt; o.Result) .ToList (); foreach (var result in results) {// Делаем что-то с результатом - result.Count; } code – jondow 28 April 2016 в 07:53
  • 3
    Очень хороший ответ @jondow. @ dace просто сделать firstList = tasks[0].Result; – Stamos 28 April 2016 в 15:09

Просто отделите создание ваших ожиданий от фактического await на них:

var firstWait = GetFirstListFilesAsync();
var secondWait = GetSecondListFilesAsync();
var thirdWait = GetThirdListFilesAsync();
firstList = await firstWait;
textBlock1.Text = "found " + firstList.Count + " first list's results";
secondList = await secondWait ;
textBlock2.Text = "found " + secondList.Count + " second list's results";
thirdList = await thirdWait ;
textBlock3.Text = "found " + thirdList.Count + " third list's results";

Это все еще не будет показывать результаты до тех пор, пока первый элемент не будет завершен, но позволит сделать параллельный ход. Это сложнее, если вы хотите иметь дело с каждым из , как , он завершается внутри одной функции, так как тогда вы должны WaitAny собирать awaitables, а затем определять (вручную), какой из них ) завершены, удалите их из коллекции и зацикливайте до тех пор, пока все не закончите.

-1
ответ дан Damien_The_Unbeliever 15 August 2018 в 17:56
поделиться

Вы можете попробовать и перенести работу в коллекцию Task s и использовать Task.WaitAll , чтобы присоединиться к потокам.

1
ответ дан David Pilkington 15 August 2018 в 17:56
поделиться
  • 1
    Или так же просто, как сближение всех ожиданий, тогда вызовите заданное текстовое значение следующим образом: firstList = ожидание GetFirstListFilesAsync (); secondList = ожидание GetSecondListFilesAsync (); thirdList = ждет GetThirdListFilesAsync (); textBlock1.Text = "найден" + firstList.Count + & quot; результаты первого списка & quot ;; textBlock2.Text = "найден" + secondList.Count + & quot; результаты второго списка & quot ;; textBlock3.Text = & quot; found & quot; + thirdList.Count + & quot; результаты третьего списка & quot; – Mumin Asaad 28 April 2016 в 07:13

Используйте ответ Дэвида или так же просто, как сближение всех ожиданий, затем вызовите заданное текстовое значение следующим образом:

firstList = await GetFirstListFilesAsync();
secondList = await GetSecondListFilesAsync();
thirdList = await GetThirdListFilesAsync();

textBlock1.Text = "found " + firstList.Count + " first list's results";

textBlock2.Text = "found " + secondList.Count + " second list's results";

textBlock3.Text = "found " + thirdList.Count + " third list's results"
1
ответ дан Mumin Asaad 15 August 2018 в 17:56
поделиться
  • 1
    Это все еще не выполняет задачи параллельно. GetSecondListFilesAsync не будет вызываться до тех пор, пока не ожидается, что GetFirstListFilesAsync завершено. – Damien_The_Unbeliever 28 April 2016 в 07:18

Я бы хотел, чтобы все ожидания выполнялись одновременно, поэтому все текстовые блоки будут обновляться более или менее одновременно. Или, может быть, не в одно и то же время - каждый TextBlock будет обновляться по мере завершения соответствующего метода ожидания.

Затем определите несколько новых методов:

private async Task<TFirst> GetFirstListFilesAndDisplayAsync()
{
  var firstList = await GetFirstListFilesAsync();
  textBlock1.Text = "found " + firstList.Count + " first list's results";
}

private async Task<TSecond> GetSecondListFilesAndDisplayAsync()
{
  var secondList = await GetSecondListFilesAsync();
  textBlock2.Text = "found " + secondList.Count + " second list's results";
}

private async Task<TThird> GetThirdListFilesAndDisplayAsync()
{
  var thirdList = await GetThirdListFilesAsync();
  textBlock3.Text = "found " + thirdList.Count + " third list's results";
}

И затем вызовите все они одновременно:

var firstTask = GetFirstListFilesAndDisplayAsync();
var secondTask = GetSecondListFilesAndDisplayAsync();
var thirdTask = GetThirdListFilesAndDisplayAsync();

await Task.WhenAll(firstTask, secondTask, thirdTask);

firstList = await firstTask;
secondList = await secondTask;
thirdList = await thirdTask;
0
ответ дан Stephen Cleary 15 August 2018 в 17:56
поделиться

Таким образом, вы не хотите группировать блоки await, вы хотите указать, что происходит, когда они завершатся.

GetFirstListFilesAsync().ContinueWith(task => {
   textBlock1.Text = "found " + task.Result.Count + " first list's results";
}); 
GetSecondListFilesAsync().ContinueWith(task => {
   textBlock2.Text = "found " + task.Result.Count + " second list's results";
}); 
GetThirdListFilesAsync().ContinueWith(task => {
   textBlock3.Text = "found " + task.Result.Count + " third list's results";
});

Этот способ будет самым быстрым способом сделать это, потому что как как только Task завершится, ваш textBlock.Text будет установлен, и они не будут ждать завершения предыдущего.

0
ответ дан vrwim 15 August 2018 в 17:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: