C#在新线程中调用方法

时间:2011-11-04 18:23:57

标签: c# multithreading

我正在寻找一种在新线程上调用方法的方法(使用C#)。

例如,我想在一个新主题上调用SecondFoo()。但是,我希望在SecondFoo()完成时终止该线程。

我在C#中看到了几个线程的例子,但没有一个适用于我需要生成的线程终止自身的特定场景。这可能吗?

如何强制运行Secondfoo()的衍生线程在完成后终止?

有没有人遇到过这方面的任何例子?

6 个答案:

答案 0 :(得分:80)

如果您实际启动了一个新线程,那么该方法完成时该 终止:

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

现在SecondFoo将在新线程中调用,线程将在完成后终止。

实际是否意味着您希望线程在调用线程中的方法完成时终止?

编辑:请注意,启动一个线程是一个相当昂贵的操作。你肯定需要一个品牌 new 线程而不是使用线程池线程吗?考虑使用ThreadPool.QueueUserWorkItem或(最好是使用.NET 4)TaskFactory.StartNew

答案 1 :(得分:55)

它真的必须是一个线程,还是一个任务呢?

如果是这样,最简单的方法是:

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

答案 2 :(得分:7)

在.Net线程中由线程池管理,所以你可以启动它而忘记它!考虑一下这段代码。

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

答案 3 :(得分:2)

除非你有一个需要非线程池线程的特殊情况,否则只需使用这样的线程池线程:

Action secondFooAsync = new Action(SecondFoo);

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

      }), secondFooAsync); 

Gaurantees呼吁EndInvoke为您负责清理工作。

答案 4 :(得分:0)

异步版本:

private async Task DoAsync()
{
    await Task.Run(async () =>
    {
        //Do something awaitable here
    });
}

答案 5 :(得分:-3)

据我了解,您需要以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]);
    }
}