最近我经历了一次非常糟糕的面试,他们用好警察/坏警察的方式与我交流。无论我怎么回答都不足够让其中一个人满意,我的信心在逐渐减少。最后让我真正困惑的是他的最后一个问题:
如果控件需要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会有什么性能影响。
请问有人可以为我解答一下吗?
Invoke
在您的线程安全设置方面容易发生死锁。 - Mark Sowul