Здравствуйте.
Есть задача — передавать вызовы некоего интерфейса в поток-исполнитель(работающий например с оборудование) и возврат результата исполнения.
Сейчас у меня это сделано через класс вроде:
internal class Request
{
public readonly Code Code;
public readonly object Payload;
public ResponseCode Response;
public object ResponsePayload;
private readonly ManualResetEventSlim _completed;
public Request(Code code, object payload)
{
Code = code;
Payload = payload;
_completed = new ManualResetEventSlim(false);
}
public void SetCompleted()
{
_completed.Set();
}
public void WaitForCompletion(CancellationToken ct)
{
_completed.Wait(ct);
}
}
internal enum ResponseCode
{
Ok,
Fail
}
internal enum Code
{
Sale,
PrintCheck
}
И очередь запросов:
private readonly BlockingCollection<Request> _requests = new BlockingCollection<Request>();
На каждый вызов снаружи есть метод с некоей сигнатурой, все параметры упаковываются в соответствующий типу запроса класс, это засовывается в Payload, коду запроса присваивается значение и т.д. После чего поток получает уведомление, распаковывает параметры и вызывает уже внутренний метод, который делает работу и возвращает результат, после чего все отдается вызывающему.
Проблема в том, что выглядит все это очень громоздко. На каждый вызов сделать код вызова, класс для запаковки, добавить ветвление в switch потока-исполнителя.
А как это бы делали вы? Какие есть фреймворки, библиотеки, подходы работы с такими вещами?