Duplicata possible:
Opération inter-thread non valide: contrôle accessible à partir d'un thread autre que le thread sur lequel il a été créé
D'accord, je sais pourquoi cela me donne cette erreur:
Opération inter-thread non valide: Contrôlez 'Form1' accessible à partir d'un thread autre que le thread sur lequel il a été créé.
Mais ... Comment puis-je rendre cela réalisable?
System.Threading.Thread t = new System.Threading.Thread(()=>
{
// do really hard work and then...
listView1.Items.Add(lots of items);
lots more UI work
});
t.Start();
Je ne me soucie pas quand ni comment le thread se termine, donc je ne me soucie pas vraiment de quelque chose de compliqué ou d'atmosphère compliquée, à moins que cela ne facilite les choses lorsque vous travaillez avec l'interface utilisateur dans un nouveau thread.
Tu ne peux pas. Les opérations d'interface utilisateur doivent être effectuées sur le thread propriétaire. Période.
Ce que vous pourriez faire, c'est créer tous ces éléments sur un thread enfant, puis appeler Control.Invoke
et faites votre liaison de données là-bas.
Ou utilisez un BackgroundWorker
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += (s, e) => { /* create items */ };
bw.RunWorkerCompleted += (s, e) => { /* databind UI element*/ };
bw.RunWorkerAsync();
Lorsque vous accédez à la propriété from à partir d'un autre thread, cette exception est levée. Pour contourner ce problème, il existe au moins 2 options.
Dire à Control de ne pas lever ces exceptions (ce qui n'est pas recommandé):
Control.CheckForIllegalCrossThreadCalls = false;
Utilisation des fonctions threadsafe:
private void ThreadSafeFunction(int intVal, bool boolVal)
{
if (this.InvokeRequired)
{
this.Invoke(
new MethodInvoker(
delegate() { ThreadSafeFunction(intVal, boolVal); }));
}
else
{
//use intval and boolval
}
}