Как принудительно переопределить дочерние элементы async в C # 5.0

Я работаю над системой, в которой ожидается, что несколько клиентских объектов будут реализовывать определенную функцию через интерфейс, и я хочу, чтобы эта функция для асинхронной работы с продолжениями (я ожидаю, что реализации будут привязаны к вводу-выводу и хочу, чтобы все клиентские объекты выполнили эту функцию как можно скорее). Я использую Visual Studio Async CTP Refresh для SP1, с C # "5.0".

Какова рекомендуемая практика для обеспечения асинхронное поведение в дочерних объектах моего абстрактного класса (см. ниже)? Я не могу (по-видимому) принудительно использовать «асинхронные» методы с использованием подхода виртуальных методов. Мне может потребоваться только тип возврата «Задача». Означает ли это, что я вообще не должен пытаться требовать асинхронного поведения в дочерних объектах? В таком случае, должен ли возвращаемый тип быть просто «недействительным»?

Открытый интерфейс - неудачное последствие дизайна системы, но это отдельная проблема. Очевидно, я не мог ограничить асинхронность никого, кто обходит BaseFoo и просто реализует интерфейс IFoo.

Вот код:

public interface IFoo
{
    void Bar(); //NOTE: Cannot use 'async' on methods without bodies.
}

public abstract class BaseFoo : IFoo
{
    public async void Bar()
    {
        await OnBar(); //QUESTION: What is the right "async delegation" pattern?
    }

    protected virtual async Task OnBar()
    {
        await TaskEx.Yield();
    }
}

public class RealFoo : BaseFoo //NOTE: May be implemented by 3rd party
{
    protected override async Task OnBar()
    {
        //CLIENT: Do work, potentially awaiting async calls

        await TaskEx.Yield(); //SECONDARY QUESTION: Is there a way to avoid this if there are no 'awaits' in the client's work?
    }
}
45
задан Lars Kemmann 8 June 2011 в 05:33
поделиться