【发布时间】:2014-07-07 19:30:24
【问题描述】:
我提前为标题道歉,但这是我能想到的最好的描述动作。
要求是处理消息总线的请求。 进来的请求可能与关联或分组这些请求的 id 有关。 我想要的行为是让请求流同步处理相关的 id。 但是可以异步处理不同的 id。
我正在使用并发字典来跟踪正在处理的请求和链接中的谓词。
这是假设提供相关请求的同步处理。
但是我得到的行为是第一个请求得到处理,第二个请求被丢弃。
我已附加来自控制台应用程序的示例代码来模拟问题。
我们将不胜感激任何方向或反馈。
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Threading.Tasks.Dataflow;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
var requestTracker = new ConcurrentDictionary<string, string>();
var bufferBlock = new BufferBlock<Request>();
var actionBlock = new ActionBlock<Request>(x =>
{
Console.WriteLine("processing item {0}",x.Name);
Thread.Sleep(5000);
string itemOut = null;
requestTracker.TryRemove(x.Id, out itemOut);
});
bufferBlock.LinkTo(actionBlock, x => requestTracker.TryAdd(x.Id,x.Name));
var publisher = Task.Run(() =>
{
var request = new Request("item_1", "first item");
bufferBlock.SendAsync(request);
var request_1 = new Request("item_1", "second item");
bufferBlock.SendAsync(request_1);
});
publisher.Wait();
Console.ReadLine();
}
}
public class Request
{
public Request(string id, string name)
{
this.Id = id;
this.Name = name;
}
public string Id { get; set; }
public string Name { get; set; }
}
}
【问题讨论】:
-
您应该让异常通过数据流的管道传播,这样您就可以看到出了什么问题。在MSDN Walkthrough 的末尾查看 MS 的完整示例。然后,您可以处理 AggregateException 以找出问题所在。
-
你的意思是你想让一个具有相同id的组一个接一个地处理,而组可以同时处理?如果是这样,你的答案是:stackoverflow.com/q/21010024/885318
-
@I3arnon - 您的解决方案似乎正是我正在寻找的。我在这里有点懒,但也许你有更多的细节。我猜你得到的密钥是动态的,即基本上消息的爆发将具有相同的密钥并且它一直在变化。当一个动作块忙于处理一条消息时,它会更新一个字典,说我正忙于这个请求,并且任何与该键匹配的后续请求都被委派给该动作块?我说的对吗?
-
@I3arnon 我认为这在这里不必要地复杂。
-
@svick 你有什么建议?
标签: c# .net task-parallel-library tpl-dataflow