2015-07-03 5 views
0

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

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

public interface I { 

    int PerformTask(); // blocks long time 

    void PerformTaskAsync(); // returns immediately 
    event Action OnTaskFinished(int result); // triggers when task is finished 
} 

Должен ли я иметь оба пути в интерфейсе или решать до одного? если да, то какой?

+1

Предоставление одного интерфейса, по-видимому, сводит к минимуму количество модульных тестов, которые вы должны написать. –

+0

В текущем коде .NET используются задачи вместо шаблона EAP, который вы опубликовали. Если вы предоставляете интерфейс, подобный тому, который вы опубликовали, ваши клиенты будут вынуждены адаптировать его к задаче, чтобы объединить его с другим асинхронным кодом. Просто укажите один метод «Задача PerformTaskAsync()» и позвольте клиентам называть его «int result = await obj.PerformTaskAsync();' –

ответ

0

Это зависит от архитектуры, в которой живет этот интерфейс.

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

Если вы можете использовать C# 5, рассмотрите функцию PerformTaskAsync, чтобы вернуть задачу, чтобы клиенты могли легко ждать завершения, если это необходимо.