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: Асинхронный интерфейс класса
От: _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.
Асинхронный интерфейс класса
От: 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[3]: Асинхронный интерфейс класса
От: Aviator  
Дата: 14.09.10 09:46
Оценка:
Здравствуйте, LF, Вы писали:

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

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

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

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

Вызывая EndXXX мы ожидаем завершения операции если она ещё не законченна. Возвращает она результат или нет не имеет значения. В модели Begin/End также предусмотрен механизм обратного вызова. Если вы уверены, что вам никогда не потребуется ожидать завершения, получать нотификации о ходе процесса, отменять операцию, то можно действительно передать в параметры функции колбэк, который будет вызван по завершению операции или реализовать событийную модель с одним событием XXXCompleted.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.