Могу ли я установить ограничение на создание потоков в ThreadPool?

Я создаю приложение Windows Phone 8, которое загружает миниатюры изображений. Каждый эскиз загружается в поток из пула потоков. Когда есть много изображений (скажем, 100), тогда производительность телефона уменьшается из-за большого количества потоков, загружающих миниатюры.

Есть ли способ, которым я могу контролировать количество потоков, созданных в пуле потоков за раз?

2
@MatthewWatson Ну, нет, это не совсем так.
добавлено автор Servy, источник
@MatthewWatson Ну, нет, это не совсем так.
добавлено автор Servy, источник
Действительно, есть способ - просто не создавайте их! Вы контролируете, не так ли?
добавлено автор Haspemulator, источник
Как это поможет? Каждая задача использует один поток из потока.
добавлено автор Matthew Watson, источник
Зачем использовать threadpool? Вы можете использовать Tasks для выполнения одной и той же вещи, не потребляя слишком много потоков из threadpool.
добавлено автор Rudi Visser, источник
Зачем использовать threadpool? Вы можете использовать Tasks для выполнения одной и той же вещи, не потребляя слишком много потоков из threadpool.
добавлено автор Rudi Visser, источник
Нам нужно будет увидеть, как вы запускаете потоки, чтобы ответить на этот вопрос. Вы предоставляете эту информацию, и я удалю downvote.
добавлено автор Security Hound, источник

8 ответы

Ответ - нет, вы не можете контролировать количество потоков в пуле потоков. Тем не менее, вы можете контролировать, сколько потоков использует ваше приложение. Вместо того, чтобы просто перебирать список изображений, которые вам нужно загрузить, и запускать задачи (или, тем не менее, вы это делаете). Создайте X количество потоков или задач, дождитесь их завершения, а затем запустите больше.

2
добавлено

Ответ - нет, вы не можете контролировать количество потоков в пуле потоков. Тем не менее, вы можете контролировать, сколько потоков использует ваше приложение. Вместо того, чтобы просто перебирать список изображений, которые вам нужно загрузить, и запускать задачи (или, тем не менее, вы это делаете). Создайте X количество потоков или задач, дождитесь их завершения, а затем запустите больше.

2
добавлено

ThreadPool.SetMaxThreads может помочь вам

0
добавлено

ThreadPool.SetMaxThreads может помочь вам

0
добавлено

Вы не можете контролировать количество потоков потоков в пуле потоков, как уже было сказано, но вы можете создать пользовательский TaskScheduler , который будет запускать только определенное количество задач одновременно. Примеры из здесь приведены здесь.

0
добавлено

Вы не можете контролировать количество потоков потоков в пуле потоков, как уже было сказано, но вы можете создать пользовательский TaskScheduler , который будет запускать только определенное количество задач одновременно. Примеры из здесь приведены здесь.

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 doneEvents = new List();

        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;
        }
    }
}
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 doneEvents = new List();

        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;
        }
    }
}
0
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Про Windows
Про Windows
941 участник(ов)

Microsoft Windows и всё, что с этим связано. Список интересных групп и каналов: https://github.com/goq/telegram-list

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot