Заранее извиняюсь за название, но это лучшее, что я мог придумать, чтобы описать действие.
Требуется обработка запросов шины сообщений. Входящие запросы могут быть связаны с идентификатором, который коррелирует или группирует эти запросы. Я хочу, чтобы поток запросов синхронно обрабатывал коррелирующие идентификаторы. Однако разные идентификаторы могут обрабатываться асинхронно.
Я использую concurrentdictionary для отслеживания обрабатываемого запроса и предиката в ссылке.
Предполагается, что это обеспечит синхронную обработку связанных запросов.
Однако поведение, которое я получаю, заключается в том, что первый запрос обрабатывается, а второй запрос отбрасывается.
Я прикрепил пример кода из консольного приложения для имитации проблемы.
Любое направление или обратная связь будут оценены.
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; }
}
}