Асинхронный интерфейс класса
От: LF  
Дата: 14.09.10 09:23
Оценка:
Добрый день.
Класс предоставляет асинхронный интерфейс.
Вопрос состоит в том, что лучше использовать об уведомлении
окончания действия:
1) callback-функция в параметре метода
public void DoSmth(Action<Result> OnDoSmth){ ... };

2) событие
public void DoSmth(){ ... };
public EventHandler<Result> DoSmthCompleted;

3) оба подхода.

Спасибо.
Re: Асинхронный интерфейс класса
От: cadet354 Россия
Дата: 14.09.10 09:29
Оценка:
Здравствуйте, LF, Вы писали:

LF>Добрый день.

LF>Класс предоставляет асинхронный интерфейс.
LF>Вопрос состоит в том, что лучше использовать об уведомлении
LF>окончания действия:
LF>1) callback-функция в параметре метода
LF>
LF>public void DoSmth(Action<Result> OnDoSmth){ ... };
LF>

LF>2) событие
LF>
LF>public void DoSmth(){ ... };
LF>public EventHandler<Result> DoSmthCompleted;
LF>

LF>3) оба подхода.

LF>Спасибо.

а BeginXXX / EndXXX чем плохи?
если выбирать из предложенных,я за п.1.
... << RSDN@Home 1.2.0 alpha 4 rev. 1270>>
Re[2]: Асинхронный интерфейс класса
От: LF  
Дата: 14.09.10 09:36
Оценка:
C>а BeginXXX / EndXXX чем плохи?
Тут немного другой случай, методом EndXXX мы требуем результат
в некий момент времени, и не важно был ли он уже получен или нет.
В моем случае класс просто должен информировать когда результат будет готов.

C>если выбирать из предложенных,я за п.1.

Тоже больше нравиться п1, но достаточно редко его встречаю.
Re: Асинхронный интерфейс класса
От: Aviator  
Дата: 14.09.10 09:40
Оценка: 1 (1)
Здравствуйте, LF, Вы писали:

LF>Добрый день.

LF>Класс предоставляет асинхронный интерфейс.
LF>Вопрос состоит в том, что лучше использовать об уведомлении
LF>окончания действия:
LF>1) callback-функция в параметре метода
LF>
LF>public void DoSmth(Action<Result> OnDoSmth){ ... };
LF>

LF>2) событие
LF>
LF>public void DoSmth(){ ... };
LF>public EventHandler<Result> DoSmthCompleted;
LF>

LF>3) оба подхода.

Смотря кто потенциальный пользователь класса. В MS рекомендуют (или вернее рекомендовали) две модели —
событийная модель
begin/end модель

Если потенциальный пользователь — высокоуровневые абстракции, например уровень представления или низкоквалифицированные программисты, то удобнее событийная модель. Если требуется большая гибкость использования, то второй вариант.
Re[3]: Асинхронный интерфейс класса
От: Aviator  
Дата: 14.09.10 09:46
Оценка:
Здравствуйте, LF, Вы писали:

C>>а BeginXXX / EndXXX чем плохи?

LF>Тут немного другой случай, методом EndXXX мы требуем результат
LF>в некий момент времени, и не важно был ли он уже получен или нет.
LF>В моем случае класс просто должен информировать когда результат будет готов.

C>>если выбирать из предложенных,я за п.1.

LF>Тоже больше нравиться п1, но достаточно редко его встречаю.

Вызывая EndXXX мы ожидаем завершения операции если она ещё не законченна. Возвращает она результат или нет не имеет значения. В модели Begin/End также предусмотрен механизм обратного вызова. Если вы уверены, что вам никогда не потребуется ожидать завершения, получать нотификации о ходе процесса, отменять операцию, то можно действительно передать в параметры функции колбэк, который будет вызван по завершению операции или реализовать событийную модель с одним событием XXXCompleted.
Re: Асинхронный интерфейс класса
От: _FRED_ Черногория
Дата: 14.09.10 10:49
Оценка: 1 (1)
Здравствуйте, LF, Вы писали:

LF>Класс предоставляет асинхронный интерфейс.

LF>Вопрос состоит в том, что лучше использовать об уведомлении
LF>окончания действия:
LF>1) callback-функция в параметре метода
LF>public void DoSmth(Action<Result> OnDoSmth){ ... };

LF>2) событие
LF>public void DoSmth(){ ... };
LF>public EventHandler<Result> DoSmthCompleted;

LF>3) оба подхода.

Я бы думал так: можно ли вызвать DoSmth() и за ним сразу же, не дожидаясь окончания, ещё раз DoSmth()?

Гарантировано ли при этом, что в первый раз событие сработает в точности для первого вызова, а во-второй — для второго?

Может ли вызывающему быть важен порядок, в котором приходят события относительно порядка вызовов?

Сможет ли подписчик события узнать, с какими параметрами вызван асинхронный метод и может ли ему это понадобиться?
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.