ThreadPool.QueueUserWorkItem с аргументом функции
Я использую С# 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
, то как использовать здесь анонимную функцию, в результате я могу написать код там вместо вызова другой функции. Если это возможно в С# v2.0, тогда, пожалуйста, направляйте меня с кодом.
Ответы
Ответ 1
Вы должны объявить метод, который имеет то же определение, что и делегат 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 });
Ответ 2
Использование выражения лямбда также будет работать
ThreadPool.QueueUserWorkItem(state => Multiply(2,3));
Ответ 3
Вот более полный пример, который возвращает результат в исходный поток и показывает, как делегат может быть определен анонимно:
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
В моем случае мне нужна анонимная функция. то есть записывать в поток асинхронно. Поэтому я использовал это:
ThreadPool.QueueUserWorkItem(state => {
serializer.Serialize(this.stream);
this.stream.Flush();
});