2012-09-11 4 views
1

J'ai une fonction qui ajoute beaucoup de fichiers à une collection et fait beaucoup d'actions sur chacun d'eux.C# UI Thread Ne répond pas

Cela provoque l'absence de réponse du programme (thread principal).

Comment puis-je déterminer la cause et résoudre le problème?

+0

Démarrez votre tâche dans un sujet différent. Quelle interface utilisez-vous? WinForms ou WPF? – opewix

+6

utiliser un arrière-plan pour faire des choses qui prend du temps sur un thread séparé afin que le thread UI ne se bloque pas. –

Répondre

0

Utilisez un autre fil.

Thread t = new Thread(new ThreadStart(() => { 
    IntensiveCalculationCode(); 
})); 

t.Start(); 

Vous pouvez également appeler le thread d'interface utilisateur à l'intérieur du fil en invoquant le répartiteur. Ils ne sont pas exactement les mêmes sur Windows Forms et WPF cependant.

+0

J'utilise WPF quelle est la différence? – user1430430

+0

sur les formulaires Windows je ne me souviens pas exactement, mais dans WPF vous appelez le répartiteur, quelque chose comme Dispatcher.Invoke (() => {CodeThatModifiesUIElementsSuchAsChangingTextboxText();}); ' –

1

Utilisez l'objet BackgroundWorker. Vous pouvez informer l'utilisateur de la progression de l'opération en utilisant les événements ReportProgress et ProgressChanged.

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    progressBar1.Value = e.ProgressPercentage; 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    backgroundWorker1.WorkerReportsProgress = true; 
    backgroundWorker1.RunWorkerAsync(); 
} 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 

    // .. stuff that takes long 

    backgroundWorker1.ReportProgress(10); 

    // .. stuff that takes long 

    backgroundWorker1.ReportProgress(20); 

    // .. stuff that takes long 

    backgroundWorker1.ReportProgress(100); 
} 

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    // Done ! 
} 
+0

Great! – user1430430