2

画像のサムネイルをダウンロードする Windows Phone 8 アプリを作成しています。各サムネイルは、スレッド プールからスレッドにダウンロードされます。多くの画像 (100 など) がある場合、サムネイルをダウンロードするスレッドが多数になるため、電話のパフォーマンスが低下します。

スレッド プールで一度に作成されるスレッドの数を制御する方法はありますか?

4

4 に答える 4

2

答えはノーです。スレッド プール内のスレッド数を制御することはできません。ただし、アプリが使用するスレッドの数を制御できます。ダウンロードする必要がある画像のリストをループするだけでなく、タスクを開始します (または、実行中の方法で)。多数のスレッドまたはタスクを作成Xし、それらが終了するのを待ってから、さらに起動します。

于 2013-02-07T13:55:16.530 に答える
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;
        }
    }
}
于 2013-03-19T19:08:38.593 に答える
0

既に述べたように、スレッド プール内のスレッドの量を制御することはできませんが、特定の数のタスクのみを同時に実行するカスタムTaskSchedulerを作成できます。ここから例を見つけることができます。

于 2013-02-07T15:23:18.540 に答える