我有一个名为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
}
}
答案 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));