0

我想编写一个辅助函数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();
    }
}
4

2 回答 2

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

相当于

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

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

于 2013-10-24T11:54:33.433 回答
0

您不能随机添加。net 代码按字符串值运行。除非您使用编译器并获取代码,否则将其编译为 DLL,然后使用反射调用它,我不知道它是如何完成的。如果这就是你需要的,我不敢问你到底需要怎么做。

如果您不需要随机代码但特定功能很好,那是您的幸运日。函数可以作为参数传递。您还可以构建一个函数列表以按顺序调用并执行此操作。您需要对此进行更多搜索,我已经很多年没有这样做了。或者也许堆垛者可以评论并添加好文章的链接。

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

于 2013-10-24T11:46:04.733 回答