我有一个带进度条的基本表单,想要传递这样的代表:
ProgressDialog.ShowAndExecute(delegate);
我无法弄清楚如何将代理连接到进度消息。
void ShowAndExecute()
{
// Handle form disabling and whatnot...
thread = new Thread(new ThreadStart(ExecuteCommand));
while (thread.IsAlive)
{
Application.DoEvents();
Thread.Sleep(100);
}
}
// Example of the method I would like to pass in
void ExecuteCommand()
{
for (int i = 0; i < 10; i++) Thread.Sleep(1000);
}
我考虑过创建一个命令应该实现的接口。他们可以在发生更新时触发事件,但是如何让调用线程知道它被触发了?
如何处理通过事件报告进度的代理和基于这些事件的行为(移动进度条)?这是一个静态对话框(以便在整个应用程序中更容易调用)
答案 0 :(得分:0)
只有ExecuteCommand
知道其当前进度。因此必须将某些接口或类传递给ExecuteCommand
方法。 ExecuteCommand
将设置进度,然后由侦听器的实现决定如何处理进度。一般情况下,听众会检查是否正在进行重大更改**,如果是,则会BeginInvoke
调用更新进度条。
** - 如果您在短时间内处理了数千个项目,那么您希望防止过多地调用BeginInvoke
,否则它将锁定UI线程。
void ExecuteCommand(IThreadController tc)
{
for (int i = 0; i < 10; i++) {
Thread.Sleep(1000);
tc.setProgress("processing ...", (i+1), 10);
}
}