C # вызов метода в новой теме - PullRequest
37 голосов
/ 04 ноября 2011

Я ищу способ вызова метода в новом потоке (используя C #).

Например, я хотел бы вызвать SecondFoo() в новом потоке.Тем не менее, я бы хотел, чтобы поток завершался по окончании SecondFoo().

Я видел несколько примеров потоков в C#, но ни один из них не применим к этому конкретному сценарию, где мне нужен порожденный поток дляпрекратить себя.Возможно ли это?

Как заставить принудительно созданный поток, работающий Secondfoo(), завершиться после завершения?

Кто-нибудь сталкивался с подобными примерами?

Ответы [ 5 ]

82 голосов
/ 04 ноября 2011

Если вы на самом деле начинаете новый поток, этот поток будет завершаться по завершении метода:

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

Теперь SecondFoo будет вызван в новом потоке, и поток завершится после его завершения.

Вы на самом деле имели в виду, что хотели, чтобы поток завершился после завершения метода в потоке , вызывающего ?

РЕДАКТИРОВАТЬ: Обратите внимание, что запуск потока является довольно дорогой операцией. Вам определенно нужна совершенно новая новая тема, а не нить пула потоков? Попробуйте использовать ThreadPool.QueueUserWorkItem или (желательно, если вы используете .NET 4) TaskFactory.StartNew.

56 голосов
/ 04 ноября 2011

Это действительно должен быть поток или тоже задача?

если так, то самый простой способ:

Task.Factory.StartNew(() => SecondFoo())
9 голосов
/ 04 ноября 2011

В .Net потоками управляет пул потоков, так что вы можете просто запустить его и забыть об этом!Рассмотрим этот код.

new Thread(new ThreadStart(SecondFoo)).Start();
2 голосов
/ 04 ноября 2011

Если у вас нет особой ситуации, когда требуется поток не из пула потоков, просто используйте поток из пула потоков следующим образом:

Action secondFooAsync = new Action(SecondFoo);

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

      }), secondFooAsync); 

Гарантирует, что EndInvoke призван позаботиться о вашей уборке.

0 голосов
/ 04 ноября 2011

Насколько я понимаю, вам нужно означать прекратить как Thread.Abort() верно? В этом случае вы можете просто выйти из Foo (). Или вы можете использовать Process , чтобы перехватить поток.

Thread myThread = new Thread(DoWork);

myThread.Abort();

myThread.Start(); 

Пример процесса:

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]);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...