线程池参数

本文关键字:参数 线程 | 更新日期: 2023-09-27 18:06:48

我一直在到处搜索,我需要一个解决方案,让我添加200-300个工作与接受参数的某个函数。我知道委托和对象作为单一参数,但我希望的东西,将允许队列的任务与不同的参数,而不是只有对象参数。

线程池参数

你可以这样做:

void MyMethod(int param)
{
    ....
}
...
ThreadPool.QueueUserWorkItem(_ => MyMethod(1));
ThreadPool.QueueUserWorkItem(_ => MyMethod(2));
ThreadPool.QueueUserWorkItem(_ => MyMethod(3));
...
ThreadPool.QueueUserWorkItem(_ => MyMethod(42));

另一种选择是让MyMethod接受Object类型的参数,并使用QueueUserWorkItem的第二次过载:

void MyMethod(object param)
{
    int value = (int)param;
    ....
}
...
ThreadPool.QueueUserWorkItem(MyMethod, 1);
ThreadPool.QueueUserWorkItem(MyMethod, 2);
ThreadPool.QueueUserWorkItem(MyMethod, 3);
...
ThreadPool.QueueUserWorkItem(MyMethod, 42);

简单示例:

        for (int i = 0; i < 100; i++)
        {
            System.Threading.ThreadPool.QueueUserWorkItem(k =>
            {
                TestMethod(k);
            }, i);
        }

没有什么可以阻止你发送一个对象列表作为对象参数,所以在实践中你可以向线程函数传递任意数量的参数。

您正在寻找一个参数化的线程启动(示例如下)

string myUrl = 'asd'
Thread t = new Thread (new ParameterizedThreadStart(FetchUrl));
t.Start (myUrl);

static void FetchUrl(object url)
{
    // use url here, probably casting it to a known type before use
}

或者你可以使用System.Threading.Tasks..

Task.Factory.StartNew(() => {
                    File.WriteAllBytes(path, response);
                });