Ho avuto di recente una di quelle interviste davvero brutte, in cui giocano con loro un poliziotto buono/cattivo. Qualunque cosa abbia risposto non era abbastanza buono per uno di loro e la mia fiducia stava diminuendo di minuto in minuto. La sua ultima domanda che mi ha davvero confuso era la seguente:Domanda intervista: quando Control.InvokeRequired usi Control.Invoke o Control.BeginInvoke?
se un controllo avrebbe bisogno di InvokeRequired ci sarebbe una differenza nel fare .Invoke o .BeginInvoke?
Lasciate che vi mostri un esempio, come ho capito:
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;
}
}
ho detto che BeginInvoke avrebbe fatto in modo asincrono mentre Invoke sarebbe arrestare il thread dell'interfaccia utente fino alla sua esecuzione. Ma non era abbastanza buono. Ciò nonostante, non capisco l'implicazione delle prestazioni qui se usassi invece Invoke. Qualcuno può illuminarmi?
Per questo motivo, 'Invoke' è vulnerabile a deadlock a seconda della configurazione di sicurezza del thread –