Ожидание всех задач, когда задачи запускаются асинхронными методами - PullRequest
0 голосов
/ 06 декабря 2018

Я пытался объединить результаты нескольких вопросов о ожидании нескольких потоков, но мой вызов await Task.WhenAll(Tasks); передается до того, как все задачи завершены!

List<Task> tasks = new List<Task>();
foreach (DownloadingFile file in downloadingFiles)
{
    Task t = new Task(async delegate { await file.PollDownload(); } );
    tasks.Add(t);
    t.Start();
}
await Task.WhenAll(tasks);
internal async Task PollDownload()
{
    string localFile = "pathToDestination";
    WebRequest headerRequest = WebRequest.Create(uri);
    headerRequest.Method = "HEAD";
    HttpWebResponse response = null;
    try
    {
        response = (HttpWebResponse) await headerRequest.GetResponseAsync();
    }
    catch
    {
        Thread.Sleep(500);
        try
        {
            response = (HttpWebResponse)await headerRequest.GetResponseAsync();
        }
        catch
        {
            response = null;
        }
    }
    if (response == null)
    {
        state = DOWNLOAD_STATE.FAILED;
        return;
    }
    totalBytes = response.ContentLength;
    state = DOWNLOAD_STATE.WAITING_START;
    //Check to see whether a local copy of the remote file exists
    if (File.Exists(localFile))
    {
        DateTime localFileUpdated = File.GetCreationTimeUtc(localFile);
        DateTime onlineFileUpdated = response.LastModified;
        // If the download date of the local file comes after the modification date of the remote copy
        // then we do not need to take any further action here.
        if (onlineFileUpdated <= localFileUpdated)
        {
            state = DOWNLOAD_STATE.SKIPPED;
        }
        //Otherwise we should remove the local copy and proceed with the download
        else
        {
            File.Delete(localFile);
        }
    }
    return;
}

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

1 Ответ

0 голосов
/ 06 декабря 2018

new Task() принимает Action, поэтому вы передаете async void, который не ожидает его результата.

Вы должны использовать Task.Run () вместо этого, который также принимает Func<Task>.

...