与添加到列表Parallel.ForEach [英] Parallel.ForEach with adding to list

查看:178
本文介绍了与添加到列表Parallel.ForEach的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图运行连接到远程站点(通过网络)的多种功能,并返回一个泛型列表。但我想同时运行它们。



例如:

 公共静态列表<&SearchResult中GT;搜索(字符串名称)
{
//初始化一个新的临时表来保存所有的搜索结果
名单,LT;信息搜索结果>结果=新的List<&SearchResult中GT;();

//循环所有供应商同时
Parallel.ForEach(供应商,currentProvider =>
{
名单<信息搜索结果> tmpResults = currentProvider.SearchTitle((标题) );

//添加从目前的供应商
results.AddRange(tmpResults)的结果;
});

//返回所有组合的结果
返回结果;
}



在我看来,多次插入到结果可以在同一happend时间...这可能崩溃我的应用程序。



我怎样才能避免这种情况?


解决方案

  //在类范围:
对象lockMe =新的对象();

//在功能
锁(lockMe)
{
results.AddRange(tmpResults);
}



基本上锁定意味着只有一个线程可以访问关键部分同时


I'm trying to run multiple functions that connect to a remote site (by network) and return a generic list. But I want to run them simultaneously.

For example:

public static List<SearchResult> Search(string title)
{
    //Initialize a new temp list to hold all search results
    List<SearchResult> results = new List<SearchResult>();

    //Loop all providers simultaneously
    Parallel.ForEach(Providers, currentProvider =>
    {
        List<SearchResult> tmpResults = currentProvider.SearchTitle((title));

        //Add results from current provider
        results.AddRange(tmpResults);
    });

    //Return all combined results
    return results;
}

As I see it, multiple insertions to 'results' may happend at the same time... Which may crash my application.

How can I avoid this?

解决方案

//In the class scope:
Object lockMe = new Object();    

//In the function
lock (lockMe)
{    
     results.AddRange(tmpResults);
}

Basically a lock means that only one thread can have access to that critical section at the same time.

这篇关于与添加到列表Parallel.ForEach的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆