使用Threadpool下载字符串并等待下载完成

时间:2013-12-23 16:28:52

标签: c# multithreading windows-phone-8 threadpool countdownevent

我正在使用WebClient上传字符串,从服务器上回复该答案。 为了更快地完成工作,我决定使用ThreadPool,但我需要知道所有下载何时结束。

到目前为止,我一直在使用CountdownEvent,它应该在处理服务器的答案时减少。

我的主线程执行:

CountdownEvent cde = new CountdownEvent(retour["contenu"].Count()); //Set the countdown with the number of Thread that needs to be created

foreach (var tab in retour["contenu"])
{
    App.AnniversaryViewModel.Items.Add(new Utilisateur(int.Parse((string)tab["id"])));
    System.Diagnostics.Debug.WriteLine("Création d'un utilisateur avec l'id : " + (string)tab["id"]);
    //System.Diagnostics.Debug.WriteLine("Le dernier utilisateur est : " + Items.Last<Utilisateur>().NOMPrenom);
    ThreadPool.QueueUserWorkItem(App.AnniversaryViewModel.Items.Last<Utilisateur>().telechargerLesInfos , cde); //Starts the download

}
//Waiting for every Thread to be done

cde.Wait();

System.Diagnostics.Debug.WriteLine("On a fini d'attendre");

在另一个类中,这是应该由每个线程执行的代码:

public void telechargerLesInfos(Object cde)
{

    APIWebTeam.sendRequest(RequestType.PROFIL, (Newtonsoft.Json.Linq.JObject reponse) =>
    {
        processInfos(reponse); //Takes the answer from the server and parse it to fill private fields
        ((CountdownEvent)cde).Signal();
    }, "&idProfil=" + id);

}

事实是委托拒绝执行,好像“cde.Wait()”也强制处理委托的线程等待。 我该如何解决/避免这种情况?

1 个答案:

答案 0 :(得分:2)

首先,线程池在这里没有做任何事情。您只是在线程池中启动异步操作。 开始这样的操作基本上没有时间。您也可以在主线程中执行此操作。

关于为什么主线程被阻塞;这很简单,你可以通过等待倒计时事件来阻止主线程。

在异步操作完成而不阻塞主线程之前,无法使主线程阻塞。他们的要求确实相互矛盾。

相反,您需要使整个程序异步,以避免阻塞主线程。例如,让此方法接受在异步操作完成时应执行的回调。另一种选择是使用任务并行库。任务使得异步操作的使用变得非常容易,特别是如果您能够利用await关键字。