我正在使用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()”也强制处理委托的线程等待。 我该如何解决/避免这种情况?
答案 0 :(得分:2)
首先,线程池在这里没有做任何事情。您只是在线程池中启动异步操作。 开始这样的操作基本上没有时间。您也可以在主线程中执行此操作。
关于为什么主线程被阻塞;这很简单,你可以通过等待倒计时事件来阻止主线程。
在异步操作完成而不阻塞主线程之前,无法使主线程阻塞。他们的要求确实相互矛盾。
相反,您需要使整个程序异步,以避免阻塞主线程。例如,让此方法接受在异步操作完成时应执行的回调。另一种选择是使用任务并行库。任务使得异步操作的使用变得非常容易,特别是如果您能够利用await
关键字。