0

在这个问题的几次关闭后添加

NO这个问题没有给出答案

我试过了,我在我的代码中引用了它,但它没有从Invoke!


原始问题

直到现在,每当我有任何其他线程必须更新 UI 上的某些内容时,我都会以这样的模式使用 InvokeRequired / BeginInvoke。

void UpdateLabel(string txt)
{
    if (this.InvokeRequired)
    {
        this.BeginInvoke(new MethodInvoker(delegate() { UpdateLabel(txt);}));
        return;
    }
    this.label1.Text = txt;
}

测试用法:

var task = Task.Run(() => UpdateLabel("Hello World!"));
task.Wait();

第一次InvokeRequired是真的,第二次是假的;

但是现在我需要使用具有返回值的方法来执行此操作。 StackOverflow 来救援!

回答说:

  • Control.BeginInvoke:在 UI 线程上执行,调用线程不等待完成。
  • Control.Invoke:在 UI 线程上执行,但调用线程在继续之前等待完成。

还有一个问题甚至给出了答案:

public static string readControlText(Control varControl)
{
    if (varControl.InvokeRequired)
    {
        return (string)varControl.Invoke(
               new Func<String>(() => readControlText(varControl)));
    }
    else
    {
        return varControl.Text;
    }
}

所以我认为:

DialogResult AskPermission(string question)
{
    if (this.InvokeRequired)
    {
        return (DialogResult) this.Invoke(
                new MethodInvoker(delegate() { AskPermission(txt);}));
    }

    return MessageBox.Show(question, caption, MessageBoxButtons.YesNoCancel);
}

唉,这行不通。第一次 InvokeRequired 为真,但没有第二次 InvokeRequired。

如何使用 Invoke / MethodInvoker?


在这个问题的几次关闭后添加

可能是我在测试代码中错误地调用它:

var task = Task.Run( () => AskPermission("What should I do?");
Dialogresult dlgResult = task.Wait();
4

0 回答 0