簡體   English   中英

帶有函數參數的 ThreadPool.QueueUserWorkItem

[英]ThreadPool.QueueUserWorkItem with function argument

我正在使用 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 中可行,請用代碼指導我。

您應該聲明一個與 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 });

使用 lambda 表達式也可以

ThreadPool.QueueUserWorkItem(state => Multiply(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;
    }
}

就我而言,我需要一個匿名函數。 即,異步寫入流。 所以我用了這個:

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

然后,在函數中 - 將對象轉換為您的參數類

public void MyFunction(object msg)
{
    MyArgumentsClass  m_MyArgumentsClass = (MyArgumentsClass)msg;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM