Я пытался объединить результаты нескольких вопросов о ожидании нескольких потоков, но мой вызов 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()
ожидает других асинхронных методов (хотя их, вероятно, можно заменить на синхронные методы, здесь их нельзя заменить на синхронные методы в другом случае этой проблемы, поэтому яеще нужно решение).