C# 带有函数参数的ThreadPool.QueueUserWorkItem
我正在使用C#2.0,希望借助C# 带有函数参数的ThreadPool.QueueUserWorkItem,c#,C#,我正在使用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
调用一个带有几个参数的方法,因此我尝试了以下方法:
ThreadPool.QueueUserWorkItem(new WaitCallback(Multiply(2, 3)));
private int Multiply(int x,int y)
{
int z=(x*y);
return z;
}
我得到编译错误。因此,请指导我,如何使用ThreadPool.QueueUserWorkItem
调用具有多个参数的函数
我还有一个问题,当我使用
ThreadPool.QueueUserWorkItem
时,如何使用here匿名函数,因此我可以在那里编写代码,而不是调用另一个函数。如果可以在C#v2.0中使用,请用代码指导我。您应该声明一个与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 });
下面是一个更完整的示例,它将结果返回到初始线程,并显示如何匿名定义委托:
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;
}
}
使用lambda表达式也可以
ThreadPool.QueueUserWorkItem(state => Multiply(2,3));
在我的例子中,我需要一个匿名函数。i、 例如,异步写入流。所以我用了这个:
ThreadPool.QueueUserWorkItem(state => {
serializer.Serialize(this.stream);
this.stream.Flush();
});
对于不使用lambda传递参数-只需将所有参数打包到一个类/对象中
MyArgumentsClass m_MyArgumentsClass = new MyArgumentsClass();
//fill arguments in class
ThreadPool.QueueUserWorkItem(new WaitCallback(MyFunction), m_MyArgumentsClass);
然后,在函数中,将对象强制转换到arguments类中
public void MyFunction(object msg)
{
MyArgumentsClass m_MyArgumentsClass = (MyArgumentsClass)msg;
我在这里问了另外一个问题,如何将匿名函数与ThreadPool.QueueUserWorkItem一起使用。因此,我不必提及任何方法名称。如何在c#v2.0中实现它。@Thomas只是这样定义它:ThreadPool.QueueUserWorkItem(委托(对象状态){},新对象[]{2,3});有没有办法不用lambda表达式来实现这一点?i、 我喜欢有标记的答案。因此,我不必在我的方法中进行所有的对象检查和转换。不幸的是,我认为没有Lambda表达式就无法做到这一点。(您必须执行显式强制转换等)。