C# - 如何在启动它们之前添加代码INTO后台线程?

时间:2013-10-24 11:36:44

标签: c# multithreading lambda threadpool

我想编写一个辅助函数start,它为我启动池线程,但在实际后台处理在同一个池线程中开始之前还添加了一些代码。所以后台线程必须做一些额外的工作。我会经常调用start,额外的代码可能会改变。所以我想为池线程创建一个有点工厂。

这甚至可能吗?如果是,我将如何将代码“注入”线程?

我试过了:

class Program
{
    private static void test()
    {
        Console.WriteLine("hello world");
    }

    private static void start1(Action param1)
    {
        ThreadPool.QueueUserWorkItem(o =>
            {
                // extra work is here
                param1.Invoke(); // starts another subthread ?
            });
    }

    private static void start2(WaitCallback param1)
    {
        ThreadPool.QueueUserWorkItem(param1);
    }

    static void Main(string[] args)
    {
        start1(new Action(test));
        start2(o => { test(); });

        Console.ReadKey();
    }
}

2 个答案:

答案 0 :(得分:1)

    ThreadPool.QueueUserWorkItem(o =>
        {
            ExtraWork();
            param1.Invoke();
        });

相当于

    ThreadPool.QueueUserWorkItem(o =>
        {
            ExtraWork();
            param1();
        });

调用委托不会启动新线程。 (为什么你认为它可能?)所以这段代码工作正常。它将按顺序调用这两个函数。

答案 1 :(得分:0)

您无法随机添加。由字符串值运行的网络代码。除非您使用编译器并获取代码,将其编译为DLL然后使用反射调用它我不知道如何完成它。如果这就是你所需要的,我很害怕问你到底该怎么做。

如果您不需要随机代码,但具体功能很好,那就是您的幸运日。函数可以作为参数传递。你也可以构建一个函数列表来按顺序调用并执行它。你需要做更多的搜索,我多年没有这样做了。或者也许堆叠器可以评论并添加链接到好文章。

如果代码需要随机生成并且不被强制为.net,示例列出目录中的文件,打开程序。那么你可以看看脚本语言。最糟糕的情况是,您可以动态构建.vbs(Visual Basic脚本)并运行它。然后等待它为结果创建一个文本文件并读取它以了解发生了什么。