Есть группа методов, выполняемых асинхронно. Запуск метода на исполнение выполняется следующим образом. Создается задача (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);
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Как нужно правильно написать программу для перехвата причины, по которой HDD выходит из сна? Или как написать программу мониторинга чтения...