5

我知道如何使用线程和后台工作人员,但只能以“静态”方式(因此对它们进行硬编码)。但是我想使用这样的东西

public static void StartThread(string _Method)
{
    Thread t = new Thread(() => _Method;
    t.Start();
}

我知道这会失败,因为它_Method是一个字符串。我读过 usingdelegates但我不确定这将如何工作以及在这种情况下是否需要它。

我想在需要时为特定功能启动一个线程(因此动态创建线程)。

4

4 回答 4

8

如果您想在不同的线程上拆分工作,您可以使用C# Task这正是您所需要的。否则,请保留 Vlad 的回答并使用接受委托的方法。

任务

Task.Factory.StartNew(() => Console.WriteLine("Hello from taskA."));

线

public static Thread Start(Action action) {
    Thread thread = new Thread(() => { action(); });
    thread.Start();
    return thread;
}

// Usage
Thread t = Start(() => { ... });
// You can cancel or join the thread here

// Or use a method
Start(new Action(MyMethodToStart));
于 2012-04-25T09:54:13.287 回答
3

要创建动态线程,您需要在运行时创建它们。在这个例子中,我创建了一个 CreateThreads 方法,它创建方法并将它们添加到线程列表中。后来我有一个方法 StartMyThreads 来启动所有线程。我希望这是你想要的。

    List<Thread> lstThreads = new List<Thread>();
    public void CreateThreads()
    {
        Thread th = new Thread(() => { MyThreadFun(); });
        lstThreads.Add(th);
    }

    private void MyThreadFun()
    {
        Console.WriteLine("Hello");
    }

    private void StartMyThreads()
    {
        foreach (Thread th in lstThreads)
            th.Start();
    }
于 2012-04-25T09:57:08.723 回答
2

你可以这样做:

public static void StartThread(string s)
{
    Thread t = new Thread(() => { Console.WriteLine(s); });
    t.Start();
}

或者,如果您更喜欢从外部设置方法:

public static void StartThread(Action p)
{
    Thread t = new Thread(p);
    t.Start();
}

...
StartThread(() => { Console.WriteLine("hello world"); });

编辑:
确实,您实际上需要

public static void StartThread(Action p)
{
    Thread t = new Thread(new ThreadStart(p));
    t.Start();
}
于 2012-04-25T09:51:38.067 回答
1
var thread = new Thread(
    (ThreadStart)delegate
        {
            Console.WriteLine("test");
        });

或者

var thread = new Thread(
    (ParameterizedThreadStart)delegate(object parameter)
        {
            Console.WriteLine(parameter);
        });

如果您决定使用 TPL 任务,请注意 TPL 使用ThreadPool线程,因此在某些情况下,与手动创建Thread的 . 因此,请阅读文档并确保您在做出此类决定时知道自己在做什么。

您可能会发现这很有用:专用线程或线程池线程?

于 2012-04-25T10:04:33.003 回答