Как сделать частичный метод асинхронным - PullRequest
0 голосов
/ 22 октября 2018

У меня есть сгенерированный код с частичным методом

{
    ...
    partial void InterceptOperationCall(IOperationContext context);
    ...

    async Task SomeMethod()
    {
        InterceptOperationCall(cntx);
        await LongOperation(cntx);
    }
}

и частичным написанием от руки

{
    partial void InterceptOperationCall(IOperationContext context)
    {
    }
}

Мне нужно делать асинхронные вызовы внутри InterceptOperationCall Кто-нибудь знает какой-нибудь способ обойти эточастичные ограничения метода?

Другими словами: Я хочу сделать InterceptOperationCall асинхронно и гарантированно перед продолжительной работой, в то же время я хочу дополнительно объявить тело этого метода в другом файле.

UPD в качестве обходного решения я выбрал:

  • не использовать сгенерированные частичные заглушки метода, а также обтекание динамическим прокси (Castle.DynamicProxy) и перехват с AsyncInterceptorBaseс (Nito.AsyncEx)
  • другой вариант, я вижу, переписать генератор кода

В любом случае я продолжаю искать лучшее решение , и если кто-то знает другие способы предоставитьопциональная возможность обернуть асинхронные вызовы с помощью некоторой асинхронной логики, пожалуйста, помогите мне.

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Я не вижу способа обойти это, который не страдает всеми недостатками асинхронной пустоты в целом (как обсуждено в связанной статье Стивена Клири в комментарии Питера Шнайдера)

Я думаю, что ваша лучшая ставкаесли вы не можете найти или записать синхронизирующую версию рассматриваемых асинхронных API-интерфейсов, это вызвать асинхронные методы, а затем использовать task.Wait () для ожидания завершения.Если у вас есть несколько асинхронных вызовов, составьте их с помощью ContinueWith.По сути, вам нужно использовать библиотеку задач в стиле .Net 4.0.

0 голосов
/ 01 ноября 2018

Частичные методы похожи на интерфейсы.Это контракт .Любой, кто реализует частичный метод, как и интерфейсный метод, выполняет этот контракт.В этом случае контракт метода является синхронным методом.Невозможно создать асинхронную реализацию, поскольку для правильной асинхронной реализации этого метода требуется, чтобы вызывающий метод знал, что это асинхронный метод, и действовал соответствующим образом.Поскольку вызывающая сторона написала контракт как синхронный метод, этого не происходит.

Таким образом, ваши решения должны изменить контракт для асинхронного метода, то есть изменить частичное объявление метода или предоставитьсинхронная, а не асинхронная реализация.

Полагаю, третьим вариантом было бы иметь интерфейс (в данном случае частичные методы), поддерживающий оба.Имейте два частичных метода, один асинхронный, другой синхронный, и пусть реализация предоставит тот, который им нужен.

0 голосов
/ 22 октября 2018

Вы можете использовать ключевое слово async при реализации частичного метода.

Так что

async partial void InterceptOperationCall(IOperationContext context) {

}

не должно быть проблемой.

...