C# 有效地使用begininvoke/endinvoke

C# 有效地使用begininvoke/endinvoke,c#,multithreading,C#,Multithreading,我使用下面的代码使用多线程执行异步操作。正如您在这里看到的,在for循环中,创建了n个线程。 如何确保资源得到正确使用。Iam使用.NET3.5框架 该操作很简单,因此每个线程不会长时间阻塞。但是,由于n的值可能非常大,我在这里试图实现的是有效的资源利用。 任何建议都会大有帮助 大体上: for(int i=0;i<n;i++) { .... PerformAsyncFunction(id); } 您可以使用并行循环。它将根据系统功能耗尽线程。循环会一直阻塞直到完成,但您不应该

我使用下面的代码使用多线程执行异步操作。正如您在这里看到的,在for循环中,创建了n个线程。 如何确保资源得到正确使用。Iam使用.NET3.5框架

该操作很简单,因此每个线程不会长时间阻塞。但是,由于n的值可能非常大,我在这里试图实现的是有效的资源利用。 任何建议都会大有帮助

大体上:

for(int i=0;i<n;i++)
{
....
    PerformAsyncFunction(id);

}

您可以使用并行循环。它将根据系统功能耗尽线程。循环会一直阻塞直到完成,但您不应该受此影响,因为它是在web请求期间进行的(您希望在刷新响应之前完成所有工作)

var workCollection=Enumerable.Range(0,n.ToList();
ConcurrentDictionary结果=新建ConcurrentDictionary();
Parallel.ForEach(workCollection,id=>{
结果:添加(id,PerformWork(id));
//在PerformWork中,您需要调用Myfunction(或者用MyfFunction替换它,或者它所做的工作)。
});
//现在,您可以使用结果中的内容更新数据库
foreach(结果中的var结果)
{

UpdateDatabase(result.Key,result.Value);//在回调方法中,我执行数据库更新,这基本上是更新endinvoke返回的bool状态。您能指出上面begininvoke/endinvoke代码中的缺陷吗。这与使用Parallel For loop有什么不同。@khcha22:您要求有效利用资源。Parallel For each可以提供这一点。使用begin/endinvoke您必须自己计算处理器和corest,可能会检查此时的系统负载,等等。可能有几个因素会影响您一刻可以启动的最佳线程数。但是,无论异步委托使用线程池如何?因此线程将被正确使用。我说得对吗?实际上,循环将l将在n=50的批处理中运行。主功能将等待,直到50个操作完成。只有这样,循环才会再次运行。
public delegate bool MyDelegate(int id); 


public bool PerformAsyncFunction(id)
{
    Mydelegate del = new Mydelegate(Myfunction);
    AsyncCallback cb = new AsyncCallback(MyCallback); 
    IAsyncResult ar = del.BeginInvoke(id, cb, null); 
}


public bool MyCallback(IAsyncResult ar) 
{
try
{ 
    Mydelegate del = (Mydelegate )((AsyncResult)ar).AsyncDelegate; try { 
    bool result = del.EndInvoke(ar); 
} 
catch (Exception ex) 
{ 
    ....
} 

}
var workCollection = Enumerable.Range(0, n).ToList();
ConcurrentDictionary<int, bool> results = new ConcurrentDictionary<bool>();

Parallel.ForEach(workCollection, id => {
  results.Add(id, PerformWork(id));
  //in PerformWork you need to call Myfunction (or just replace it with MyfFunction, or the work it does).
});

//now you can update the database with what's in results
foreach(var result in results)
{
  UpdateDatabase(result.Key, result.Value); //<-- Key is id, while Value is the boolean result
}