标签: parallel-extensions

如何在连续任务中强制执行任务中的异常?

我有一个任务来执行HttpWebRequest使用

 Task<WebResponse>.Factory.FromAsync(req.BeginGetRespone, req.EndGetResponse)
Run Code Online (Sandbox Code Playgroud)

这显然可能会失败WebException.对于调用者我想返回一个Task<HttpResult>where HttpResult辅助类型来封装响应(或不是).在这种情况下,4xx或5xx响应也不例外.

因此,我在请求任务中附加了两个延续.一个与TaskContinuationOptions OnlyOnRanToCompletion另一个OnlyOnOnFaulted.然后将整个事物包裹Task<HttpResult>起来以获取一个结果,无论哪个继续完成.

使用该AttachedToParent选项创建三个子任务(请求加两个延续)中的每一个.

但是当调用者等待返回的外部任务时,AggregateException抛出的是请求失败.

我想,在故障延续中,观察WebException所以客户端代码只能查看结果.添加一个Waiton on fault continuation抛出,但是试一试这个并没有帮助.也不看Exception属性(如节"五合一例外通过使用Task.Exception属性"暗示在这里).

我可以安装一个UnobservedTaskException事件处理程序来过滤,但由于事件没有提供与故障任务的直接链接,这可能会在应用程序的这一部分之外进行交互,并且是一个大锤破解的例子.

鉴于出现故障的情况,Task<T>有没有办法将其标记为"故障处理"?

简化代码:

public static Task<HttpResult> Start(Uri url) {
    var webReq = BuildHttpWebRequest(url);
    var result = new HttpResult();
    var taskOuter = Task<HttpResult>.Factory.StartNew(() => {
        var tRequest = Task<WebResponse>.Factory.FromAsync(
                            webReq.BeginGetResponse,
                            webReq.EndGetResponse,
                            null, TaskCreationOptions.AttachedToParent);
        var tError = tRequest.ContinueWith<HttpResult>( …
Run Code Online (Sandbox Code Playgroud)

.net-4.0 parallel-extensions

5
推荐指数
1
解决办法
1395
查看次数

使用.Net Parallel Extensions(Parallel.Invoke)进行多个异步调用?

目前,我有一段代码需要对各种数据提供者进行大约7次Web服务调用.每次调用都需要几秒钟才能执行,所以我想并行运行它们以加快速度.

我将7个调用包装在Parallel.Invoke中,它可以同时运行几个东西,但在2核心服务器上,它一次只执行2个,每个核心一个.由于我正在做的就是等待Web服务调用返回,我希望它能够获取所有7并等待它们返回.

有没有办法做到这一点?或许我的方法错了?也许我需要创建对Web服务的异步调用?但那么如何等待他们全部回来再继续前进?

.net asynchronous parallel-extensions

5
推荐指数
1
解决办法
2739
查看次数

Parallel.For()循环中的进度更新

你可以猜到Parallel.For()循环的索引从一个值跳转到另一个值.我如何估算完成的工作量?

谢谢.

.net parallel-extensions

5
推荐指数
1
解决办法
2005
查看次数

任务并行库 - 自定义任务计划程序

我要求将Web服务请求发送到在线api,我认为Parallel Extensions非常适合我的需求.

有问题的Web服务被设计为重复调用,但是如果您每秒超过一定数量的呼叫,则有一种机制可以向您收费.我显然希望尽量减少我的收费,因此想知道是否有人看过可以应对以下要求的TaskScheduler:

  1. 限制每个时间跨度计划的任务数.我想如果请求的数量超过这个限制那么它需要丢弃任务或可能阻止?(停止任务的后退日志)
  2. 检测相同的请求是否已经在要执行的调度程序中但尚未执行,如果是,则不对第二个任务进行排队,而是返回第一个任务.

人们是否觉得这些是任务调度员应该处理的那种责任,还是我在咆哮错误的树?如果您有其他选择,我愿意接受建议.

c# parallel-extensions task-parallel-library

5
推荐指数
1
解决办法
2544
查看次数

ConcurrentBag <T>获取重复项(似乎不是线程安全的)

我必须在某处做错事,因为我在我的concurrentbag中得到了重复的项目,这里是事件链

  var listings = new ConcurrentBag<JSonListing>();
  Parallel.ForEach(Types, ParallelOptions, (type, state) =>
  {
      ...
      status = ProcessType(listings, status, type, state);
      ....
   });

  private GeocodeResults ProcessType(ConcurrentBag<JSonListing> listings, GeocodeResults status, XElement type, ParallelLoopState state)
  {
      ....
      AddListingsToList(results, type, listings);
      .... 
  }

private void AddListingsToList(dynamic results, XElement type, ConcurrentBag<JSonListing> listings)
    {

        var typeMustMatch = type.Attribute("TypeMustMatch").Value;
        var typeID = Convert.ToInt32(type.Attribute("ID").Value);

        foreach (var result in results.results)
        {


            var foundListing = listings.SingleOrDefault(x => x.ID == result.id);
            if (foundListing != null)
            {
                var typeIDs = foundListing.TypeIDs.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList();
                if …
Run Code Online (Sandbox Code Playgroud)

c# parallel-extensions

5
推荐指数
2
解决办法
5768
查看次数

4
推荐指数
1
解决办法
354
查看次数

多级ConcurrentDictionary是否仍然是线程安全的?

我有四个级别的数据结构定义如下:

Dictionary<Type1, Dictionary<Type2, Dictionary<Type3, List<Type4>>>>
Run Code Online (Sandbox Code Playgroud)

整个事情被封装在一个同样保持线程安全的类中.目前它只是在读取/操作数据时锁定整个集合(读取比写入更常见).

我正在考虑更换Dictionarywith ConcurrentDictionaryListwith ConcurrentBag(它的项目不必订购).

如果我这样做,我可以消除锁定并确保并发集合能够正常工作吗?

.net c# concurrency .net-4.0 parallel-extensions

4
推荐指数
1
解决办法
2636
查看次数

使用PLINQ时如何避免内存不足异常?

嗨,谢谢你的期待!

背景

我有一项计算任务需要大量时间或并行计算.

具体来说,我需要循环遍历大约50个图像的列表,Base64对它们进行编码,然后计算每个新编码项目与包含大约2000个Base64字符串编码图像的XML文件中的值之间的Levenshtein距离,以便找到字符串.具有最小Lev的XML文件.与基准字符串的距离.

常规foreach循环工作,但速度太慢,所以我选择使用PLINQ来利用我的Core i7多核处理器:

Parallel.ForEach(candidates, item => findImage(total,currentWinner,benchmark,item));
Run Code Online (Sandbox Code Playgroud)

任务开始非常出色,高速奔跑,但后来我得到了一个"内存不足"的例外.

我正在使用C#,.NET 4,Forms App.

我如何调整我的PLINQ代码,以便我没有可用的内存耗尽?

更新/示例代码

这是调用PLINQ的方法foreach:

private void btnGo_Click(object sender, EventArgs e)
{
    XDocument doc = XDocument.Load(@"C:\Foo.xml");
    var imagesNode = doc.Element("images").Elements("image"); //Each "image" node contains a Base64 encoded string.
    string benchmark = tbData.Text; //A Base64 encoded string.
    IEnumerable<XElement> candidates = imagesNode;

    currentWinner = 1000000; //Set the "Current" low score to a million and bubble lower scores into it's place iteratively.

    Parallel.ForEach(candidates, i => { …
Run Code Online (Sandbox Code Playgroud)

c# linq parallel-processing parallel-extensions plinq

4
推荐指数
1
解决办法
734
查看次数

使用并行库添加到列表时保证线程安全的正确方法

我遍历一个连接字符串数组,并在每个循环中提取一些信息并添加到列表中.现在,我想使用并行库使其成为多线程,但我不确定该库是否保证对列表的写入是线程安全的,还是我需要使用锁定:

List<SomeType> list = new List<SomeType>();

settings.AsParallel().ForAll(setting => 
{
    list.AddRange(GetSomeArrayofSomeType(setting)); /// DO I NEED TO DO LOCKING HERE???
})
Run Code Online (Sandbox Code Playgroud)

c# multithreading thread-safety parallel-extensions

4
推荐指数
1
解决办法
6677
查看次数

如何使用 LINQ 等待 ParallelQuery?

我有一个异步方法,应该查找数据库条目。它按名称过滤,因此是并行执行的候选者。

但是,我找不到一种简单的方法来支持并行执行和异步任务。

这是我所拥有的:

private async Task<List<Item>> GetMatchingItems(string name) {
    using (var entities = new Entities()) {
        var items =  from item in entities.Item.AsParallel()
               where item.Name.Contains(name)
               select item;
        return await items.ToListAsync(); //complains "ParallelQuery<Item> does not contain a definition for ToListAsync..."
    }
}
Run Code Online (Sandbox Code Playgroud)

当我删除它时AsParallel(),它将编译。AI 不应该同时使用这两个功能吗?还是我理解有问题?

IHMO,两者都有道理:

  • AsParallel()表示数据库查询可能会分成几个同时运行的子查询,因为任何项目的单独匹配都不依赖于任何其他项目。更新:这个例子中的坏主意,请参阅评论和答案!
  • ToListAsync()将支持此方法的异步执行,以允许其他匹配方法(在其他数据上)立即开始执行。

如何同时使用并行执行(使用 LINQ)和异步任务?

linq asynchronous parallel-extensions async-await

4
推荐指数
1
解决办法
2285
查看次数