ThreadPool.QueueUserWorkItem с аргументом функции - PullRequest
16 голосов
/ 06 апреля 2011

Я использую C # 2.0 и хочу вызвать метод с парой параметров с помощью ThreadPool.QueueUserWorkItem, поэтому я попытался сделать следующее:

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, тогда, пожалуйста, сообщите мне код.

Ответы [ 4 ]

35 голосов
/ 06 апреля 2011

Вы должны объявить метод, который имеет то же определение, что и делегат WaitCallback. Вы можете использовать следующий фрагмент кода:

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]);
}

Версия анонимного делегата:

 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 });
16 голосов
/ 10 июля 2013

Использование лямбда-выражения также будет работать

ThreadPool.QueueUserWorkItem(state => Multiply(2,3));
4 голосов
/ 06 апреля 2011

Вот более полный пример, который возвращает результат в исходный поток и показывает, как делегат может быть определен анонимно:

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;
    }
}
0 голосов
/ 15 декабря 2017

В моем случае мне нужна была анонимная функция. записывать в поток асинхронно. Поэтому я использовал это:

ThreadPool.QueueUserWorkItem(state => {
    serializer.Serialize(this.stream);
    this.stream.Flush();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...