C# 暂停循环,直到下载事件完成

C# 暂停循环,直到下载事件完成,c#,C#,如何暂停someRandomMethod()中的循环,直到DownloadCompleted()中的代码执行完毕?下面的代码仅解压缩版本数组中的最新版本。这就像循环比第一次下载要快,并且m_CurrentlyDownloading在第一次执行DownloadCompleted()时具有最新的值 private void someRandomMethod() { for (int i = 0; i < versions.Count; i++) { //Clea

如何暂停someRandomMethod()中的循环,直到DownloadCompleted()中的代码执行完毕?下面的代码仅解压缩版本数组中的最新版本。这就像循环比第一次下载要快,并且m_CurrentlyDownloading在第一次执行DownloadCompleted()时具有最新的值

private void someRandomMethod() {
    for (int i = 0; i < versions.Count; i++)
    {
        //ClearInstallFolder();
        m_CurrentlyDownloading = versions.ElementAt(i);
        Download(versions.ElementAt(i));
        LocalUpdate(versions.ElementAt(i));
        System.Threading.Thread.Sleep(500);
    }
}

private void Download(string p_Version)
{
    string file = p_Version + ".zip";
    string url = @"http://192.168.56.5/" + file;

    //client is global in the class
    client = new WebClient();
    client.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadCompleted);
    client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressChanged);
    client.DownloadFileAsync(new Uri(url), @"C:\tmp\" + file);
}


private void DownloadCompleted(object sender, AsyncCompletedEventArgs e)
{
    if (e.Error == null)
    {
        Unpack(m_CurrentlyDownloading);
        if (GetInstalledVersion() == GetLatestVersion())
            ClearZipFiles();
    }
    else
        MessageBox.Show(e.Error.ToString());
}
private void方法(){
for(int i=0;i
类似的东西可以用来等待

使其成为类属性

      bool IsDownloadCompleted=false;
将此添加到下载完成事件中

      IsDownloadCompleted=true;
这是你想要停止循环的地方

   while(DownloadCompleted!=true)
  {
     Application.DoEvents();
   }

像这样的东西可以用来等待

使其成为类属性

      bool IsDownloadCompleted=false;
将此添加到下载完成事件中

      IsDownloadCompleted=true;
这是你想要停止循环的地方

   while(DownloadCompleted!=true)
  {
     Application.DoEvents();
   }

像这样的东西可以用来等待

使其成为类属性

      bool IsDownloadCompleted=false;
将此添加到下载完成事件中

      IsDownloadCompleted=true;
这是你想要停止循环的地方

   while(DownloadCompleted!=true)
  {
     Application.DoEvents();
   }

像这样的东西可以用来等待

使其成为类属性

      bool IsDownloadCompleted=false;
将此添加到下载完成事件中

      IsDownloadCompleted=true;
这是你想要停止循环的地方

   while(DownloadCompleted!=true)
  {
     Application.DoEvents();
   }

最简单的方法是不要使用
*async
方法。正常下载文件将暂停执行,直到完成

但是如果你有权访问wait关键字,试试这个

private async Task Download(string p_Version)
{
  string file = p_Version + ".zip";
  string url = @"http://192.168.56.5/" + file;

  //client is global in the class
  client = new WebClient();
  client.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadCompleted);
  client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressChanged);
  await client.DownloadFileAsync(new Uri(url), @"C:\tmp\" + file);
}

最简单的方法是不要使用
*async
方法。正常下载文件将暂停执行,直到完成

但是如果你有权访问wait关键字,试试这个

private async Task Download(string p_Version)
{
  string file = p_Version + ".zip";
  string url = @"http://192.168.56.5/" + file;

  //client is global in the class
  client = new WebClient();
  client.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadCompleted);
  client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressChanged);
  await client.DownloadFileAsync(new Uri(url), @"C:\tmp\" + file);
}

最简单的方法是不要使用
*async
方法。正常下载文件将暂停执行,直到完成

但是如果你有权访问wait关键字,试试这个

private async Task Download(string p_Version)
{
  string file = p_Version + ".zip";
  string url = @"http://192.168.56.5/" + file;

  //client is global in the class
  client = new WebClient();
  client.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadCompleted);
  client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressChanged);
  await client.DownloadFileAsync(new Uri(url), @"C:\tmp\" + file);
}

最简单的方法是不要使用
*async
方法。正常下载文件将暂停执行,直到完成

但是如果你有权访问wait关键字,试试这个

private async Task Download(string p_Version)
{
  string file = p_Version + ".zip";
  string url = @"http://192.168.56.5/" + file;

  //client is global in the class
  client = new WebClient();
  client.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadCompleted);
  client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressChanged);
  await client.DownloadFileAsync(new Uri(url), @"C:\tmp\" + file);
}

创建一些布尔变量,创建一个委托并为此变量获取\设置方法。 然后在循环中使smth像:

while(!isDownLoadCompleted)Thread.Sleep(1024);

创建一些布尔变量,创建一个委托并为此变量获取\设置方法。 然后在循环中使smth像:

while(!isDownLoadCompleted)Thread.Sleep(1024);

创建一些布尔变量,创建一个委托并为此变量获取\设置方法。 然后在循环中使smth像:

while(!isDownLoadCompleted)Thread.Sleep(1024);

创建一些布尔变量,创建一个委托并为此变量获取\设置方法。 然后在循环中使smth像:

while(!isDownLoadCompleted)Thread.Sleep(1024);

您可以使用Paralel.ForEach。此循环将等待所有线程完成。 查看此处了解如何使用: 或
您可以使用Paralel.ForEach。此循环将等待所有线程完成。 查看此处了解如何使用: 或
您可以使用Paralel.ForEach。此循环将等待所有线程完成。 查看此处了解如何使用: 或
您可以使用Paralel.ForEach。此循环将等待所有线程完成。 查看此处了解如何使用: 或

如果首先需要同步API,为什么要使用异步API?o如果首先需要同步API,为什么要使用异步API?o如果首先需要同步API,为什么要使用异步API?o如果首先需要同步API,为什么要使用异步API?这就是路。或者使用AutoResetEvent并将其设置为下载完成,以获得您的答案!我无法使用此选项,我得到了“找不到'async'修饰符所需的所有类型。您是针对错误的框架版本,还是缺少对程序集的引用?”(我针对的是4.0)。但是,您提到我不应该使用*异步方法。有其他选择吗?:)尝试
client.DownloadFile(新的Uri(url),@“C:\tmp\”+文件)泰,你会被录取的,先生!非异步的CompletedEventhandler的名称是什么?找不到关于它的任何信息:对于非异步代码,您不需要CompletedEventHandler,因为下一行代码在完成之前不会执行-只需在下一行中自己调用事件处理程序即可。这就是方法。或者使用AutoResetEvent并将其设置为下载完成,以获得您的答案!我无法使用此选项,我得到了“找不到'async'修饰符所需的所有类型。您是针对错误的框架版本,还是缺少对程序集的引用?”(我针对的是4.0)。但是,您提到我不应该使用*异步方法。有其他选择吗?:)尝试
client.DownloadFile(新的Uri(url),@“C:\tmp\”+文件)泰,你会被录取的,先生!非异步的CompletedEventhandler的名称是什么?找不到关于它的任何信息:对于非异步代码,您不需要CompletedEventHandler,因为下一行代码在完成之前不会执行-只需在下一行中自己调用事件处理程序即可。这就是方法。或者使用AutoResetEvent并将其设置为下载完成,以获得您的答案!我不能使用这个,我得到“找不到所有类型所需的th”