在这个问题的几次关闭后添加
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();