[英]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.