2012-11-13 2 views
0

J'ai la liste des fichiers (widgets) dont j'ai besoin pour travailler. Je veux le faire de manière asynchrone afin que mon interface reste réactive. Je veux mettre à jour l'interface utilisateur avec le progrès. Voici mon code prototype. Comment puis-je accomplir cela? Je suppose que j'ai besoin d'utiliser le filetage, mais je ne veux pas non plus couvrir tous les threads en même temps, un par un va bien.Comment programmer le traitement asynchrone de widgets?

void Process() 
{ 
    var documents = GetDocuments(); 
    foreach(document in documents) 
    { 
     ProcessDocument(
     document, 
     status => this.TextBox.Text += status); 
    } 
} 

void ProcessDocument(Document document, Action<string> onCompleted) 
{ 
} 

Répondre

1

Vous pouvez utiliser le BackgroundWorker class pour traiter asynchrone d'opération dans Windows Forms projets.

BackgroundWorker worker = new BackgroundWorker(); 
worker.WorkerReportsProgress = true; 
worker.DoWork += (sender, args) => { 
    var documents = GetDocuments(); 
    foreach(var document in documents) 
    { 
     ProcessDocument(document); 
     worker.ReportProgress(0, status); 
    } 
}; 
worker.ProgressChanged += (sender, args) => { 
    this.TextBox.Text += args.UserState.ToString(); 
}; 
worker.RunWorkerAsync(); 
+0

BackgroundWorker est déconseillé en faveur de la programmation par tâches – LMB

+0

@LMB Où avez-vous lu cela? La page MSDN sur BackGroundWorker ne mentionne pas cela. En passant, je suis d'accord avec vous que TPL est la meilleure approche pour Frameworks 4 et plus. –

+0

@PanosRontogiannis Je vais essayer de trouver la page exacte, mais je me souviens que c'était dans MSDN, dans l'une des pages à propos de Tâches namespace une utilisation de la tâche. – LMB

1

Vous pouvez utiliser le System.Threading.Thread classe

Rappelez-vous que vous devrez utiliser les délégués à mettre à jour en toute sécurité les contrôles sur votre interface utilisateur vous ne pouvez pas modifier les contrôles lors de l'exécution dans un autre que le fil d'interface utilisateur principal.

Si vous voulez le faire facilement sans délégués parce que vous pensez que vous pouvez contrôler vous pouvez définir la propriété

Control.CheckForIllegalCrossThreadCalls=false 

Vous serez autorisé à mettre à jour les contrôles sans contrôle Croix illégale de fil

Si vous préférez utiliser la classe BackgroundWorker, cela vous permet de lier et a appelé l'événement ProgressChanged qui vous permet de mettre à jour l'interface utilisateur trop

public void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
    { 
    //thread work 
    } 

    // This event handler updates the UI 
    private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     // Update the UI here 

    } 
0

Framework 4.5 a introduit les mots clés async/await qui simplifient la programmation asynchrone .NET.

Jetez un oeil à TPL si vous utilisez Framework 4.

Si l'autre vous utilisez des versions antérieures de .NET (3.5 et plus) alors vous devriez jeter un oeil à APM.

Questions connexes