Ich habe kürzlich eines dieser wirklich schlechten Interviews gehabt, wo sie einen guten Polizisten/einen schlechten Polizisten spielen. Was auch immer ich antwortete, war nicht gut genug für einen von ihnen, und mein Selbstvertrauen schwoll von Minute zu Minute. Seine letzte Frage, die mich wirklich verwirrte, war die folgende:Interview Frage: Wenn Control.InvokeRequired verwenden Sie Control.Invoke oder Control.BeginInvoke?
Wenn ein Steuerelement InvokeRequired benötigen würde, würde es einen Unterschied in tun. Invoke oder. BeginInvoke?
Lassen Sie mich Ihnen ein Beispiel, wie ich es verstehe:
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;
}
}
ich erwähnt, dass BeginInvoke es asynchron tun würde, während Invoke den UI-Thread werden Einhalt zu gebieten würde, bis ihr ausgeführt. Aber das war nicht gut genug. Trotzdem verstehe ich die Performance-Implikation hier nicht, wenn ich stattdessen Invoke verwende. Darf mich bitte jemand aufklären?
Aus diesem Grund ist 'Invoke' anfällig für Deadlocks, abhängig von Ihrer Thread-Sicherheitseinstellung –