簡體   English   中英

SmartThreadPool - 是否可以使用方法參數傳遞委托方法?

[英]SmartThreadPool - Is it possible to pass delegate method with method parameters?

我有一個名為ImportProductInformation的長時間運行進程,我正在嘗試加速調試,這似乎是一個很好的線程池候選者,所以我做了一點搜索並遇到了CodeProject上的SmartThreadPool並試圖實現它。

ImportProductInformation當前需要一個“item”,它只是從列表中拉出的單個實體框架行。 SmartThreadPool使用一個名為"WorkItemCallback"的委托,但是如果我像下面那樣構建它,它會在smartThreadPool.QueueWorkItem的foreach循環中抱怨“Method name expected”,因為看起來我無法將params傳遞給委托方法。 我在這里錯過了什么? 我確定這是一個愚蠢的東西......諾布缺乏與代表的經驗...任何幫助將不勝感激:

    public static void ImportProductInformation_Exec()
    {
        // List
        List<productinformation> _list = GetProductInformation();

        // Import
        if (_list != null)
        {
            SmartThreadPool smartThreadPool = new SmartThreadPool();

            foreach (var item in _list)
            {
                smartThreadPool.QueueWorkItem
                  (new WorkItemCallback
                    (ImportProductInformation(item)));
            }

            smartThreadPool.WaitForIdle();
            smartThreadPool.Shutdown();
        }
    }

    public void ImportProductInformation(productinformation item)
    {
        // Do work associated with "item" here
    }

如果我將循環更改為此,我會在構建錯誤中獲得“類似於類型的方法”:

            foreach (var item in _list)
            {
                ImportProductInformation ipi = 
                  new ImportProductInformation(item);

                smartThreadPool.QueueWorkItem(new WorkItemCallback(ipi));
            }

結束了它的工作:

public class ProductInformationTaskInfo
{
    public productinformation ProductInformation;

    public ProductInformationTaskInfo(productinformation pi)
    {
        ProductInformation = pi;
    }
}

public class PI
{
    foreach (var item in _list)
    {
        ProductInformationTaskInfo pi = 
          new ProductInformationTaskInfo(item);
        smartThreadPool.QueueWorkItem
          (new WorkItemCallback
            (ImportProductInformation), pi);
    }

    public static object ImportProductInformation(Object _pi)
    {
        ProductInformationTaskInfo pi = (ProductInformationTaskInfo)_pi;
        var item = pi.ProductInformation;

        // Do work here
    }
}

我不知道或沒有SmartThreadPool,以下是近似值:

foreach (var item in _list)
{
   var itemCopy = item;
   smartThreadPool.QueueWorkItem
              (dummy => ImportProductInformation(itemCopy));
}

你可能需要做一些修復。
這是有效的,因為lambda從包含方法中捕獲變量。 這就是你需要itemCopy的原因。

但請注意,正常的ThreadPool 適合長時間運行任務,SmartThreadPool也是如此。 它還應該限制線程數,並且當ImportProductInformation主要執行I / O線程時可能根本沒有幫助。

您可以使用匿名方法:

int a = 15;
String b = "hello world!";
ThreadPool.QueueUserWorkItem((state)=>SomeFunction(a,b));

暫無
暫無

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

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