Выполнение кода в блоке try/catch

210
20 сентября 2017, 09:35

Есть группа методов, выполняемых асинхронно. Запуск метода на исполнение выполняется следующим образом. Создается задача (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);
    }
}
Answer 1

Ну у вас же все готово, только чуть-чуть изменить

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);
    }
}
READ ALSO
Чтение содержимого сайта [дубликат]

Чтение содержимого сайта [дубликат]

На данный вопрос уже ответили:

242
IO.FileSystemWatcher HDD просыпается по непонятной причине

IO.FileSystemWatcher HDD просыпается по непонятной причине

Как нужно правильно написать программу для перехвата причины, по которой HDD выходит из сна? Или как написать программу мониторинга чтения...

210
webClient возвращает 403 или 500

webClient возвращает 403 или 500

Хочу узнать данные по этой ссылке

191