Я новичок в SO, пожалуйста, потерпите меня.
У меня есть служба WCF с контрактом на дуплексную службу. Этот сервисный контракт имеет операционный контакт, который предполагает длительную обработку данных. Я вынужден ограничить количество одновременных обработок данных, скажем, максимум 3. Моя проблема в том, что после обработки данных мне нужно вернуться к тому же контексту экземпляра службы, поэтому я перезваниваю своей конечной точке инициатора, передавая результат обработки данных. Я должен упомянуть, что по разным причинам я ограничен потоками данных TPL и дуплексом WCF.
Вот демонстрация того, что я написал до сих пор
В консольной библиотеке я имитирую вызовы WCF
class Program
{
static void Main(string[] args)
{
// simulate service calls
Enumerable.Range(0, 5).ToList().ForEach(x =>
{
new System.Threading.Thread(new ThreadStart(async () =>
{
var service = new Service();
await service.Inc(x);
})).Start();
});
}
}
Вот что должно быть службой WCF
// service contract
public class Service
{
static TransformBlock<Message<int>, Message<int>> transformBlock;
static Service()
{
transformBlock = new TransformBlock<Message<int>, Message<int>>(x => Inc(x), new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism = 3
});
}
static Message<int> Inc(Message<int> input)
{
System.Threading.Thread.Sleep(100);
return new Message<int> { Token = input.Token, Data = input.Data + 1 };
}
// operation contract
public async Task Inc(int id)
{
var token = Guid.NewGuid().ToString();
transformBlock.Post(new Message<int> { Token = token, Data = id });
while (await transformBlock.OutputAvailableAsync())
{
Message<int> message;
if (transformBlock.TryReceive(m => m.Token == token, out message))
{
// do further processing using initiator service instance members
// something like Callback.IncResult(m.Data);
break;
}
}
}
}
public class Message<T>
{
public string Token { get; set; }
public T Data { get; set; }
}
Контракт операции на самом деле не обязательно должен быть асинхронным, но мне нужно уведомление OutputAvailableAsync.
Это хороший подход или есть лучшее решение для моего сценария?
Заранее спасибо.