我正在创建一个下载图片缩略图的Windows Phone 8应用程序。每个缩略图都从线程池中的线程上下载。当有很多图像(比如100)时,由于大量线程下载缩略图,手机性能会下降。
有没有办法可以控制一次在线程池中创建的线程数?
答案 0 :(得分:2)
答案是否定的,您无法控制线程池中有多少个线程。但是,您可以控制应用程序使用的线程数。而不只是循环遍历您需要下载的图像列表,并解雇任务(或者您正在执行它)。创建X
个线程或任务,等待完成,然后再激活。
答案 1 :(得分:0)
如前所述,您无法控制线程池中的线程数量,但您可以创建一个仅同时运行一定数量任务的自定义TaskScheduler。您可以在here找到示例。
答案 2 :(得分:0)
您可以看到以下代码作为示例。这里我们将线程分成块,每个块将有32个线程。希望这会对你有所帮助。
int noofthread = accounts.Length;
int startindex = 0;
int endindex = 32;
/* Runs the threads in 32 item chunks */
try
{
int noofchunk = (int)Math.Ceiling(((double)noofthread / 32.00));
if (noofthread < endindex)
endindex = noofthread;
for (int chunk = 0; chunk < noofchunk; chunk++)
{
List<ManualResetEvent> doneEvents = new List<ManualResetEvent>();
for (int i = startindex; i < endindex; i++)
{
int accountID = Convert.ToInt32(accounts[i].Id, CultureInfo.InvariantCulture);
string accountName = Convert.ToString(accounts[i].Name, CultureInfo.CurrentCulture);
//List AccountID : AccountNames as they're running
AddTransactionRecord(new StackFrame(true), accountID + ":" + accountName);
//Create RunDate
ReportingService.Date reportDate = new ReportingService.Date();
reportDate.Day = _appSettings.ReportDate.Day;
reportDate.Month = _appSettings.ReportDate.Month;
reportDate.Year = _appSettings.ReportDate.Year;
// Create object of your class
Class c = new Class();
doneEvents.Add(c.DoneEvent);
ThreadPool.QueueUserWorkItem(c.ThreadPoolCallback, i);
}
WaitHandle.WaitAll(doneEvents.ToArray());
startindex += 32;
endindex += 32;
if (endindex > noofthread)
{
endindex = noofthread;
}
}
}
答案 3 :(得分:0)
ThreadPool.SetMaxThreads可以帮助你