我可以限制在ThreadPool中创建线程吗?

时间:2013-02-07 13:38:15

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

我正在创建一个下载图片缩略图的Windows Phone 8应用程序。每个缩略图都从线程池中的线程上下载。当有很多图像(比如100)时,由于大量线程下载缩略图,手机性能会下降。

有没有办法可以控制一次在线程池中创建的线程数?

4 个答案:

答案 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可以帮助你