2016-05-08 6 views
2
private async void button1_Click(object sender, EventArgs e) 
{ 
    await BackupFile(); 
} 


public async Task BackupFile() 
{ 
    await Task.Run(() => 
    { 
    for (var i = 0; i < partCount; i++) 
    { 
     upload(FilePart);//how to creat a new task at here 
     //i don't want to wait here, i want to upload all part at same time 
    } 
    //wait here. 
    //if total part got 10, then how to wait 10 task complete 
    //after 10 task complete 
    Console.WriteLine("Upload Successful"); 
    }); 
} 

Как создать новую задачу в цикле и как ждать всю задачу полностью, чтобы выполнить код следующей строкиКак создать задачу в цикле и ждать всю задачу полного

+0

когда-либо слышал о 'async'? это кажется правильным для этой ситуации. после переписывания вашего 'upload'-mehtod в async вы можете вызвать somtehing как' wait upload (FilePart); 'который ждет, пока операция не будет завершена. – cramopy

+0

Вы можете просто использовать 'Parallel.For' и ограничить параллелизм, но если' upload' можно назвать async, у вас есть лучшие варианты. См. Http://stackoverflow.com/a/11565317/224370 для примера параллельного выполнения задач async. –

+1

Я нахожусь на телефоне только для комментариев, но вы захотите сделать свою функцию 'upload' async, создайте' List 'перед циклом' for ', замените' upload (FilePart) 'на' myList.Add (upload (FilePart)) 'и, наконец, добавить' wait Task.WhenAll (myList) 'после цикла' for'. Если вы не получили ответа в течение нескольких часов, когда я вернусь к компьютеру, я дам полный ответ. – JRLambert

ответ

5

Вы должны попробовать задачи combinator WhenAll:

public async Task BackupFileAsync() 
{ 
    var uploadTasks = new List<Task>(); 
    for (var i = 0; i < partCount; i++) 
    { 
     var uploadTask = Task.Run(() => upload(FilePart)); 
     uploadTasks.Add(uploadTask) 
    } 

    await Task.WhenAll(uploadTasks); 

    Console.WriteLine("Upload Successful"); 
} 
+1

Вы забыли добавить 'uploadTask' в коллекцию' uploadTasks' –

+1

Он рекомендовал ждать Task вместо Task.Wait, как этот 'await Task.WhenAll (uploadTasks);' – CodeNotFound

+1

Внешний task.run бессмыслен. Избавьтесь от него и дождитесь WhenAll –

Смежные вопросы