Я работаю над системой, в которой ожидается, что несколько клиентских объектов будут реализовывать определенную функцию через интерфейс, и я хочу, чтобы эта функция выполнялась асинхронно с продолжениями (я ожидаю, что реализации будут привязаны к вводу-выводу и хочу убедитесь, что все клиентские объекты завершат эту функцию как можно скорее). Я использую 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?
}
}