0

由于这个新线程是通过委托创建的,因为什么原因this.InvokeRequired等于Falsewithin ?InitUIState()

我的问题是我的标签从未被设置并且this.BeginInvoke()从未执行,我想这是由于事实InvokeRequired= False

    private delegate void BackgroundOperationDelegate(ViewMode mode);
    private BackgroundOperationDelegate backgroundOperationDelegate;

    private void FormControlPanel_Load(object sender, EventArgs e)
    {
        Init();
    }

    private void Init() {
        this.backgroundOperationDelegate = this.InitUIState;
        this.backgroundOperationDelegate.BeginInvoke(mode, null, null);
    }

    private void InitUIState(ViewMode mode)
    {
        // .. other business logic only here relevant
        // to the worker process ..
        this.BeginInvoke((MethodInvoker)delegate
        {
            this.labelProgramStatus.Text = CONSOLE_IDLE_STATUS;
        });
    }

我一次又一次地使用这种模式,但由于某种原因,这一次它没有执行:P(是的,只有一个InitUIState()被调用的实例,即来自委托)

多谢你们。

验证两个不同线程的图像:http:
//imgur.com/mq12Wl&X5R7G
http://imgur.com/mq12W&X5R7Gl

后续问题:这是创建线程的不受欢迎的方式吗?我一直觉得它如此简单和轻量级。也许我应该使用thread.Start()并且我会避免这些问题?

4

3 回答 3

2

您的第二个 BeginInvoke 将引发异常。

尝试

private void InitUIState(ViewMode mode)
{
    if (this.InvokeRequired)
    {
        this.BeginInvoke((MethodInvoker)delegate
        {
            InitUIState(mode);
        });
    }
    else
    {
        this.labelProgramStatus.Text = CONSOLE_IDLE_STATUS;
    }
}
于 2010-09-02T10:32:25.503 回答
0

您正在混合 Form 和 Delegate 的 BeginInvoke,因为它们都具有相同的方法名称。

Form 的方法,BeginInvoke 在同一个 UI 线程中调用您请求的方法,但在稍后阶段,在处理自己的待处理 UI 操作之后。这就是原因,在 Form 的 BeginInvoke 方法中,InvokeRequired 将始终为 false。

Delegate 的方法,BeginInvoke 在线程池中的一个新线程上异步调用该方法。并且委托的 BeginInvoke 中的 InvokeRequired 将始终为真。

于 2010-09-02T10:01:37.070 回答
-1

InvokeBeginInvoke对代表不一样ISynchronizeInvoke

您还需要EndInvoke在与代表打交道时打电话。

于 2010-09-02T09:56:23.087 回答