画像のサムネイルをダウンロードする Windows Phone 8 アプリを作成しています。各サムネイルは、スレッド プールからスレッドにダウンロードされます。多くの画像 (100 など) がある場合、サムネイルをダウンロードするスレッドが多数になるため、電話のパフォーマンスが低下します。
スレッド プールで一度に作成されるスレッドの数を制御する方法はありますか?
画像のサムネイルをダウンロードする Windows Phone 8 アプリを作成しています。各サムネイルは、スレッド プールからスレッドにダウンロードされます。多くの画像 (100 など) がある場合、サムネイルをダウンロードするスレッドが多数になるため、電話のパフォーマンスが低下します。
スレッド プールで一度に作成されるスレッドの数を制御する方法はありますか?
答えはノーです。スレッド プール内のスレッド数を制御することはできません。ただし、アプリが使用するスレッドの数を制御できます。ダウンロードする必要がある画像のリストをループするだけでなく、タスクを開始します (または、実行中の方法で)。多数のスレッドまたはタスクを作成X
し、それらが終了するのを待ってから、さらに起動します。
以下のコードを例として見ることができます。ここでは、スレッドをチャンクに作成しました。各チャンクには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;
}
}
}
既に述べたように、スレッド プール内のスレッドの量を制御することはできませんが、特定の数のタスクのみを同時に実行するカスタムTaskSchedulerを作成できます。ここから例を見つけることができます。