c# ThreadPool /WaitCallback - 在这种情况下如何委托
本文关键字:这种情况下 何委托 ThreadPool WaitCallback | 更新日期: 2023-09-27 17:56:05
>我有一个程序,可以在工作时用不同的图标显示其进度。该过程通过按 btnApply Buton 开始。
ManualResetEvent[] wait;
private void btnApply_Click(object sender, EventArgs e)
{
wait = new ManualResetEvent[1];
wait[0] = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(new WaitCallback(doApply), 0);
WaitHandle.WaitAny(wait);
btnApply.Text = "Done!";
}
private void doApply(object dummy)
{
for (int i = 0; i < 14; i++)
{
setPic(i, bmTODO);
}
// do something
for (int i = 0; i < 14; i++)
{
setPic(i, bmWORK);
// do something
setPic(i, bmOK);
}
}
public void setPic(int i, Image img)
{
switch (i)
{
case 0: pictureBox1.Image = img; break;
case 1: pictureBox2.Image = img; break;
case 2: pictureBox3.Image = img; break;
case 3: pictureBox4.Image = img; break;
case 4: pictureBox5.Image = img; break;
case 5: pictureBox6.Image = img; break;
case 6: pictureBox7.Image = img; break;
case 7: pictureBox8.Image = img; break;
case 8: pictureBox9.Image = img; break;
case 9: pictureBox10.Image = img; break;
case 10: pictureBox11.Image = img; break;
case 11: pictureBox12.Image = img; break;
case 12: pictureBox13.Image = img; break;
case 13: pictureBox14.Image = img; break;
default: break;
}
}
对于 Win7 和 2 处理器,这"按预期"工作。
但是在XP上,我必须切换任务 - 但是我如何在这个特殊代码中做到这一点?我不想在doApply中指定每个图片框。
我还尝试了与代表:
public delegate void setPicDelegate(int i, Image img);
但是没有令人满意的结果:程序挂起或图标最近一起显示。
我能做什么?
问题是您使用以下内容阻止了 UI 线程:WaitHandle.WaitAny(wait);
. 需要允许 btnApply_Click
方法在长时间运行的任务完成之前结束,以允许 UI 线程处理新操作。
在 UI 上下文中对长时间运行的任务进行建模的一种简单方法是使用 BackgroundWorker
,因为它会为您抽象出许多问题。
在 DoWork
事件处理程序中执行所有长时间运行的工作,并在使用 RunWorkerCompleted
事件完成工作时更新 UI。 该事件处理程序将在 UI 线程中运行。 该类还支持将结果传递到 UI、处理 UI 中的进度更改信息等。