首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带函数参数的ThreadPool.QueueUserWorkItem

带函数参数的ThreadPool.QueueUserWorkItem
EN

Stack Overflow用户
提问于 2011-04-06 18:16:11
回答 5查看 41.8K关注 0票数 25

我使用的是C# 2.0,并且希望在ThreadPool.QueueUserWorkItem的帮助下调用一个带有几个参数的方法,所以我尝试了如下操作:

代码语言:javascript
复制
ThreadPool.QueueUserWorkItem(new WaitCallback(Multiply(2, 3)));

private int Multiply(int x,int y)
{
  int z=(x*y);
  return z;
}

我遇到编译错误。因此,请指导我,如何使用ThreadPool.QueueUserWorkItem调用具有多个参数的函数?

我有另一个问题,当我使用ThreadPool.QueueUserWorkItem时,那么如何使用这里的匿名函数,作为结果,我可以在那里编写代码,而不是调用另一个函数。如果这在C# v2.0中是可能的,那么请用代码指导我。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-04-06 18:23:53

您应该声明一个与WaitCallback委托具有相同定义的方法。您可以使用以下代码片段:

代码语言:javascript
复制
ThreadPool.QueueUserWorkItem(Multiply, new object[] { 2, 3 }); 

public static void Multiply(object state)
{
    object[] array = state as object[];
    int x = Convert.ToInt32(array[0]);
    int y = Convert.ToInt32(array[1]);
}

匿名委派版本为:

代码语言:javascript
复制
 ThreadPool.QueueUserWorkItem(delegate(object state)
    {
        object[] array = state as object[];
        int x = Convert.ToInt32(array[0]);
        int y = Convert.ToInt32(array[1]);
    }
    , new object[] { 2, 3 });
票数 41
EN

Stack Overflow用户

发布于 2013-07-10 23:34:45

使用lambda表达式也可以

代码语言:javascript
复制
ThreadPool.QueueUserWorkItem(state => Multiply(2,3));
票数 21
EN

Stack Overflow用户

发布于 2011-04-06 18:48:47

下面是一个更完整的示例,它将结果返回到初始线程,并展示了如何匿名定义委托:

代码语言:javascript
复制
class Program
{
    static void Main(string[] args)
    {
        using (MultiplyTask task = new MultiplyTask() { Multiplicands = new int[] { 2, 3 } })
        {
            WaitCallback cb = new WaitCallback(delegate(object x)
            {
                MultiplyTask theTask = x as MultiplyTask;
                theTask.Result = theTask.Multiplicands[0] * theTask.Multiplicands[1];
                theTask.Set();
            });
            ThreadPool.QueueUserWorkItem(cb, task);

            Console.WriteLine("Calculating...");
            if (task.WaitOne(1000))
            {
                Console.WriteLine("{0} times {1} equals {2}", task.Multiplicands[0], task.Multiplicands[1], task.Result);
            }
            else
            {
                Console.WriteLine("Timed out waiting for multiplication task to finish");
            }
        }
    }

    private class MultiplyTask : EventWaitHandle
    {
        internal MultiplyTask() : base(false, EventResetMode.ManualReset) { }
        public int[] Multiplicands;
        public int Result;
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5564737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档