2010-05-10 2 views
0

Я просто не могу понять, почему IAsyncResult является интерфейсом вместо простого объекта. Как я правильно помню, интерфейс содержит только имена методов без реализации, поэтому я не вижу, как он используется здесь, поскольку я не получаю никакого класса и не переопределяю его методы? Я просто смущен. СпасибоIasyncresult - почему это не просто объект, почему это интерфейс?

+1

Возможный дубликат [Почему не BeginInvoke возвращает ссылку типа AsyncResult?] (Http://stackoverflow.com/questions/2352161/why-doesnt-begininvoke-return-reference-of-type-asyncresult) –

ответ

1

Таким образом, результатом может быть любой тип объекта, который реализует интерфейс IAsyncResult.

Вы правы, что интерфейс содержит только методы/свойства без реализации. В этом случае гарантируется, что объект AsyncResult содержит методы, которые необходимы для «Async-framework».

IAsyncResult содержит четыре свойства:

  • AsyncState (Объект)
  • AsyncWaitHandle (WaitHandle)
  • CompletedSynchronously (Boolean)
  • IsCompleted (Boolean)

Эти свойства являются просто требуется при работе с методами Async. Если бы это был объект, вы бы были менее гибкими, я думаю.

2

Если бы это было просто объект, это может быть что угодно - и вы могли бы не полагаться на определенные свойства и/или методов присутствует, как вы можете, когда вы знаете, вы получите объект, который реализует интерфейс IAsyncResult ,

Поскольку объект вы получаете обратно необходимо реализовать интерфейс в вопросе, вы можете рассчитывать на то, что свойства AsyncState, AsyncWaitHandle, CompletedSynchronously и IsCompleted будет присутствовать.

Если у вас был только объект, и вы вернулись int - как бы вы получили эти свойства, которые вам нужны?

1

Потому что «ASyncResult» сам по себе ничего конкретного.

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

Например, если я метод мой возвращаю тип Foo, я могу создать асинхронный тип возвращаемого значения для моего приложения просто путем создания подкласса говоря

FooAsync : Foo, IAsyncResult 

И просто бросьте в отличие написания кода для извлечения значения.

 Смежные вопросы

  • Нет связанных вопросов^_^