我最近接受了一次非常糟糕的采访,他们和你一起扮演好警察/坏警察。无论我回答什么,对他们来说都不够好,我的信心每分钟都在萎缩。他最后一个让我很困惑的问题是:
如果控件需要 InvokeRequired,在执行 .Invoke 或 .BeginInvoke 时会有所不同吗?
举个例子,我是怎么理解的:
public delegate string WorkLongDelegate(int i);
var del = new WorkLongDelegate(WorkLong);
var callback = new AsyncCallback(CallBack);
del.BeginInvoke(3000, callback, del);
public string WorkLong(int i)
{
Thread.Sleep(i);
return (string.Format("Work was done within {0} seconds.", i));
}
private void CallBack(IAsyncResult ar)
{
var del = (WorkLongDelegate) ar.AsyncState;
SetText2(del.EndInvoke(ar));
}
private void SetText2(string s)
{
if(InvokeRequired)
{
// What is the difference between BeginInvoke and Invoke in below?
BeginInvoke(new MethodInvoker(() => textBox1.Text = s));
}
else
{
textBox1.Text = s;
}
}
我提到 BeginInvoke 将异步执行此操作,而 Invoke 将暂停 UI 线程直到其执行。但这还不够好。尽管如此,如果我使用 Invoke 代替,我不明白这里的性能含义。有人可以启发我吗?