Есть группа методов, выполняемых асинхронно. Запуск метода на исполнение выполняется следующим образом. Создается задача (Task), в аргументы передается конструкция вида try { вызываемый метод() } catch { обработка_ошибок } (как лямбда выражение)
и вызывается Start(). Собственно, такой код повторяется в группе вызывающих методов, но, в виду того, что и в вызывающих методах присутствуют конструкции try/catch (проверка доступа к данным) методы получаются громоздкими. Хотелось бы иметь приватный метод класса, например RunAsync( метод, который должен выпонляться асинхронно) в котором уже есть try/catch конструкция и в блоке try вызывается переданный метод. Задача в принципе решается использованием делегатов, но асинхронные методы имеют разные сигнатуры и пилить под каждый делегат не хочется. Можно ли как нибудь решить эту проблему поизящнее? Тот же Task каким то образом принимает на вход лябда выражение, которое затем выполняет, но как это работает не понятно.
Например, как сейчас сделано:
public void BeginAsyncMethod(paramType param){
try{
var repoValue0 = firstRepository.get(x=>x.id == param.id);
var repoValue1 = secondRepository.get(x=>x.creationDate > param.creationDate);
new Task(()=>{
try{
LongWorkingMethod(repoValue0,repoValue1);
}catch(Exception ex){
Diagnostics.TraceError(ex);
}
}).Start();
}
catch(Exception ex){
Diagnostics.TraceError(ex);
}
}
private void LongWorkingMethod(RepoParamType param0, RepoParamType param1){
...
}
Как хотелось бы:
public void BeginAsyncMethod(paramType param){
try{
var repoValue0 = firstRepository.get(x=>x.id == param.id);
var repoValue1 = secondRepository.get(x=>x.creationDate > param.creationDate);
RunAsync(LongWorkingMethod(repoValue0,repoValue1));
// или лямбдой ()=>{LongWorkingMethod(...);
}
catch(Exception ex){
Diagnostics.TraceError(ex);
}
}
private void LongWorkingMethod(RepoParamType param0, RepoParamType param1){
...
}
private void RunAsync(Method){
try{
Method.Invoke();
}
catch(Exception ex){
Diagnostics.TraceError(ex);
}
}
Ну у вас же все готово, только чуть-чуть изменить
private void RunAsync(Action action)
{
new Task(()=>
{
try
{
action();
}
catch(Exception ex){
Diagnostics.TraceError(ex);
}).Start();
}
Использование:
public void BeginAsyncMethod(paramType param)
{
try
{
var repoValue0 = firstRepository.get(x=>x.id == param.id);
var repoValue1 = secondRepository.get(x=>x.creationDate > param.creationDate);
RunAsync(() => LongWorkingMethod(repoValue0,repoValue1)); //Лямбдой
}
catch(Exception ex){
Diagnostics.TraceError(ex);
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Как нужно правильно написать программу для перехвата причины, по которой HDD выходит из сна? Или как написать программу мониторинга чтения...