有效地使用begininvoke / endinvoke

时间:2014-08-09 19:56:01

标签: c# multithreading

我使用以下代码使用多线程执行异步操作。正如您在此处所见,在for循环中,创建了n个线程。 如何确保资源得到正确使用。我使用.net 3.5框架。

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

在Main:

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

}

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) 
{ 
    ....
} 

}

1 个答案:

答案 0 :(得分:0)

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

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
}

关于数据库更新,我将在一次往返中全部发送。您可以查看有关如何执行此操作的ADO.NET结构化参数。

更多关于parallel for each here

  

对源集合进行分区并安排工作   基于系统环境的多线程。处理器越多   在系统上,并行方法运行得越快。