6 votes

Applications multithreads

J'ai lu les articles sur MSDN, mais mon esprit est mort (cela arrive généralement quand je lis MSDN (Sans vouloir offenser MSDN, mais vos articles m'embrouillent parfois.)), et j'essaie de faire un peu de "travail de fond" dans mon application, mais je ne sais pas trop comment. C'est juste une méthode unique. Mais l'application se bloque, et je dois attendre jusqu'à 1 à 3 minutes pour qu'elle soit ... débloquée ?

Y a-t-il des exemples simples qui traînent en ligne quelque part et avec lesquels je peux jeter un coup d'œil ou jouer ?

Merci à tous

4voto

Darin Dimitrov Points 528142

Jon Skeet a écrit une belle introduction au multithreading dans .NET que vous pourriez lire. Il couvre également threading dans WinForms . Il peut aller entre les lignes :

public partial class Form1 : Form
{
    private BackgroundWorker _worker;

    public Form1()
    {
        InitializeComponent();
        _worker = new BackgroundWorker();
        _worker.DoWork += (sender, e) =>
        {
            // do some work here and calculate a result
            e.Result = "This is the result of the calculation";
        };
        _worker.RunWorkerCompleted += (sender, e) =>
        {
            // the background work completed, we may no 
            // present the result to the GUI if no exception
            // was thrown in the DoWork method
            if (e.Error != null)
            {
                label1.Text = (string)e.Result;
            }
        };
        _worker.RunWorkerAsync();
    }
}

0voto

Venemo Points 7213

Darin vous a déjà raconté la théorie.

Mais vous devriez vérifier les statiques ThreadPool.QueueUserWorkItem méthode. C'est plus pratique.

0voto

Chris S Points 32376

Il y a déjà cette question décente avec de nombreux liens vers des articles qui sont plus faciles à digérer que MSDN.

L'article de Jon Skeet est le plus simple et probablement le plus complet pour commencer, et la série de Joe Duffy va beaucoup plus en profondeur. En parcourant les C# et multithreading Les tags dans Stackoverflow vous donnent également quelques bonnes réponses.

Vous pourriez trouver qu'éviter le BackgroundWorker le moyen le plus rapide de se lancer, et d'utiliser simplement un Invoke :

void ButtonClick(object sender,EventArgs e)
{
    Thread thread = new Thread(Worker);
    thread.Start();
}

void Worker()
{
    if (InvokeRequired)
    {
        Invoke(new Action(Worker));
        return;
    }

    MyLabel.Text = "Done item x";
}

Certaines personnes aiment utiliser le BackgroundWorker sur Stackoverflow, d'autres non (je suis dans le camp numéro 2).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X