Question C # Appeler une méthode dans un nouveau thread


Je cherche un moyen d'appeler une méthode sur un nouveau thread (en utilisant C #).

Par exemple, je voudrais appeler SecondFoo() sur un nouveau fil. Cependant, je voudrais alors que le fil se termine quand SecondFoo() finit.

J'ai vu plusieurs exemples de threading dans C#, mais aucun ne s’applique à ce scénario spécifique où j’ai besoin du thread généré pour se terminer. Est-ce possible?

Comment puis-je forcer le thread généré Secondfoo() terminer à la fin?

Quelqu'un at-il rencontré des exemples de cela?


29
2017-11-04 18:23


origine


Réponses:


Si vous commencez réellement un nouveau thread, ce thread volonté se termine lorsque la méthode se termine:

Thread thread = new Thread(SecondFoo);
thread.Start();

À présent SecondFoo sera appelé dans le nouveau thread, et le thread se terminera quand il se termine.

As tu réellement signifie que vous voulez que le thread se termine lorsque la méthode dans le appel le fil est terminé?

EDIT: Notez que démarrer un thread est une opération assez coûteuse. Avez-vous besoin d'une marque? Nouveau thread plutôt que d'utiliser un thread threadpool? Pensez à utiliser ThreadPool.QueueUserWorkItem ou (de préférence, si vous utilisez .NET 4) TaskFactory.StartNew.


68
2017-11-04 18:28



Est-ce que ça doit vraiment être un fil, ou est-ce que ça peut aussi être une tâche?

Si oui, le plus simple est:

Task.Factory.StartNew(() => SecondFoo())

45
2017-11-04 18:28



Dans .Net Threads sont gérés par Thread Pool afin que vous puissiez simplement le démarrer et l'oublier! Considérez ce code.

new Thread(new ThreadStart(SecondFoo)).Start();

5
2017-11-04 18:33



Sauf si vous avez une situation particulière qui nécessite un thread de pool de threads différent, utilisez simplement un thread de pool de threads comme celui-ci:

Action secondFooAsync = new Action(SecondFoo);

secondFooAsync.BeginInvoke(new AsyncCallback(result =>
      {
         (result.AsyncState as Action).EndInvoke(result); 

      }), secondFooAsync); 

Les garanties que EndInvoke est appelé à prendre soin du nettoyage pour vous.


1
2017-11-04 18:29



Si je comprends bien, vous avez besoin de terminer Thread.Abort() droite? Dans ce cas, vous pouvez simplement quitter le Foo (). Ou vous pouvez utiliser Processus attraper le fil

Thread myThread = new Thread(DoWork);

myThread.Abort();

myThread.Start(); 

Exemple de processus:

using System;
using System.Diagnostics;
using System.ComponentModel;
using System.Threading;
using Microsoft.VisualBasic;

class PrintProcessClass
{

    private Process myProcess = new Process();
    private int elapsedTime;
    private bool eventHandled;

    // Print a file with any known extension.
    public void PrintDoc(string fileName)
    {

        elapsedTime = 0;
        eventHandled = false;

        try
        {
            // Start a process to print a file and raise an event when done.
            myProcess.StartInfo.FileName = fileName;
            myProcess.StartInfo.Verb = "Print";
            myProcess.StartInfo.CreateNoWindow = true;
            myProcess.EnableRaisingEvents = true;
            myProcess.Exited += new EventHandler(myProcess_Exited);
            myProcess.Start();

        }
        catch (Exception ex)
        {
            Console.WriteLine("An error occurred trying to print \"{0}\":" + "\n" + ex.Message, fileName);
            return;
        }

        // Wait for Exited event, but not more than 30 seconds.
        const int SLEEP_AMOUNT = 100;
        while (!eventHandled)
        {
            elapsedTime += SLEEP_AMOUNT;
            if (elapsedTime > 30000)
            {
                break;
            }
            Thread.Sleep(SLEEP_AMOUNT);
        }
    }

    // Handle Exited event and display process information.
    private void myProcess_Exited(object sender, System.EventArgs e)
    {

        eventHandled = true;
        Console.WriteLine("Exit time:    {0}\r\n" +
            "Exit code:    {1}\r\nElapsed time: {2}", myProcess.ExitTime, myProcess.ExitCode, elapsedTime);
    }

    public static void Main(string[] args)
    {

        // Verify that an argument has been entered.
        if (args.Length <= 0)
        {
            Console.WriteLine("Enter a file name.");
            return;
        }

        // Create the process and print the document.
        PrintProcessClass myPrintProcess = new PrintProcessClass();
        myPrintProcess.PrintDoc(args[0]);
    }
}

-3
2017-11-04 18:29