SmartThreadPool - 是否可以使用方法参数传递委托方法?

时间:2011-10-13 14:58:35

标签: c# multithreading entity-framework

我有一个名为ImportProductInformation的长时间运行进程,我正在尝试加速控制台调用,这似乎是线程池的一个很好的候选者,所以我做了一些搜索并遇到了{ {3}}在CodeProject上,我正在尝试实现它。

ImportProductInformation目前需要一个“item”,它只是从列表中拉出的单个实体框架行。 SmartThreadPool使用名为"WorkItemCallback"的委托,但如果我按照下面的方式构建它,则会在smartThreadPool.QueueWorkItem的foreach循环中抱怨“预期方法名称”,因为看起来我无法通过委托方法的参数。我在这里错过了什么?我确定这是一个愚蠢的东西...... noob缺乏与代表的经验...任何帮助将不胜感激:

    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
    }
}

2 个答案:

答案 0 :(得分:1)

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

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

你可能需要做一些修理 这是有效的,因为lambda从包含方法中捕获变量。这就是你需要itemCopy的原因。

但请注意,正常的ThreadPool 适合于长跑任务,SmartThreadPool也是如此。它还应该限制线程数,并且当ImportProductInformation主要执行I / O线程时可能根本没有帮助。

答案 1 :(得分:1)

您可以使用匿名方法:

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