私は現在、多くの時間がかかるタスクを実装しています。 基本的に、私がしたいのは、foreachループ内で複数のタスクを実行することです。 Parallel.ForEachを使用して私のUIをフリーズしようとしました。私は一度に10のuidのように呼びたいと思う。ここでループ内で複数のスレッドを実行する方法
foreach (var uid in listBox2.Items)
{
if (StopEmail) break;
Application.DoEvents();
string jsonstring = GetEmails(uid.ToString(), token);
if (jsonstring != null)
{
label6.Text = " Current UID: " + listBox2.Items.IndexOf(uid);
dynamic jsonResponse = JsonConvert.DeserializeObject(jsonstring);
string idstt = jsonResponse["email"];
if (idstt != null)
{
listBox3.Items.Add(idstt);
label4.Text = "Total Emails: " + listBox3.Items.Count.ToString();
}
}
}
は私Parallel.ForEachコード:
var files = listBox2.Items.Cast<String>().ToList();
Parallel.ForEach(files, uid =>
{
Application.DoEvents();
string jsonstring = GetEmails(uid.ToString(), token);
if (jsonstring != null)
{
this.Invoke(new MethodInvoker(delegate()
{
label6.Text = " Current UID: " + listBox2.Items.IndexOf(uid);
}));
dynamic jsonResponse = JsonConvert.DeserializeObject(jsonstring);
string idstt = jsonResponse["email"];
if (idstt != null)
{
this.Invoke(new MethodInvoker(delegate()
{
listBox3.Items.Add(idstt);
label4.Text = "Total Emails: " + listBox3.Items.Count.ToString();
}));
}
}
});
これがUIをフリーズしている場合は、UIスレッドでforeachの外側部分を実行しています。バックグラウンドワーカーでUIスレッドを実行して、描画を続けるようにしてください。バックグラウンドスレッドから、parallel.ForEachを使用して試してください。 – meganaut
はこのWPFまたはWinformsです –
@meganautはparallel.foreachコードの編集を確認してください。 –