Tendo ad usare StatusStrip nella parte inferiore della maggior parte delle mie applicazioni per semplici aggiornamenti di stato e occasionalmente una barra di avanzamento.Come si effettuano chiamate cross-threaded a ToolStripStatusLabel?
Tuttavia, sembra che ToolStripStatusLabels non erediti dal controllo, quindi non hanno .Invoke o .InvokeRequired. Quindi, come faccio a fare una chiamata thread-safe per cambiare la sua proprietà text?
risposte codificati per i posteri e altri che vengono alla ricerca:
Action<string> test=(text) =>
{
if (this._statusStrip.InvokeRequired) this._statusStrip.Invoke(
new MethodInvoker(() => this._lblStatus.Text = text));
else this._lblStatus.Text = text;
};
o
private void TestInvoker(string text)
{
if (this._statusStrip.InvokeRequired)
this._statusStrip.Invoke(
new MethodInvoker(() => this._lblStatus.Text = text));
else this._lblStatus.Text = text;
}
@Maslow: Prestare attenzione nella logica intorno Control.Invoke.Le regole esposte nei documenti sono sottili e soggette a errori se non vengono lette attentamente. Per favore controlla il codice che ho nel link nella mia risposta per un uso più corretto di Invoke. Ad esempio, la tua implementazione non sta verificando che 'ToolStrip' non sia stato eliminato e non sta verificando che l'handle di' ToolStrip' sia stato creato. –
A parte il fatto che l'handle non è ancora stato creato, sembra che questi casi non facciano altro che generare eccezioni se si verificano comunque, giusto? E se l'handle non è ancora stato creato, non sono sicuro che sia utile fingere che non sia successo nulla e non lanciare un'eccezione. – Maslow