模态进度对话框 - 如何传递委托?

时间:2015-03-23 23:47:20

标签: winforms .net-4.0

我有一个带进度条的基本表单,想要传递这样的代表:

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);
}

我考虑过创建一个命令应该实现的接口。他们可以在发生更新时触发事件,但是如何让调用线程知道它被触发了?

如何处理通过事件报告进度的代理和基于这些事件的行为(移动进度条)?这是一个静态对话框(以便在整个应用程序中更容易调用)

1 个答案:

答案 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);
    }
}