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

Modal Progress Dialog - How to pass in delegate?

我有一个带进度条的基本表单,我想传入这样的委托:

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

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

您如何处理传递通过事件报告进度并根据这些事件采取行动(移动进度条)的委托?这是一个静态对话框(为了更容易在整个应用程序中调用)

只有ExecuteCommand知道它当前的进度。因此必须将某些接口或 class 传递给 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);
    }
}