2010-02-10 2 views
0

Мне просто интересно узнать, почему тип возврата асинхронного вызова в C# является IAsynceResult?Почему тип возврата асинхронного вызова является IAsyncResult в .NET?

+0

@Praveen: этот вопрос не имеет ничего общего с C#. Тип возврата асинхронного вызова в VB.NET тот же, что и во всех .NET lanaguages. Это потому, что это не языковая функция - это функция .NET. См. Различие? –

ответ

2

Что еще это будет? Это не может быть «окончательным» результатом вызова, поскольку этого пока не будет известно. В основном это значение, представляющее асинхронный вызов, так что вы можете позже определить, завершено ли оно, какой результат был и т. Д.

Это позор, который не является общим (в типе результата) для не-void асинхронных вызовов, но это из-за наследия .NET 1, не поддерживающего generics.

EDIT: Я почти упомянул Task<T> изначально. Проблема в том, что существует много мест, где метод уже объявлен для возврата IAsyncResult, и вы не можете просто менять API влево, вправо и в центр. Я иногда задаюсь вопросом, насколько чище будет .NET, если бы MS ждала дженериков перед выпуском. Конечно, такой аргумент всегда применим, но для дженериков особенно важно ИМО.

+1

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

+2

Конечно, PFX действительно обеспечивает такой общий возврат: 'Задача .Factory.FromAsync' возвращает' Задача ', а 'Задача ' реализует 'IAsyncResult'.Наконец, получилась лучшая модель. – Richard

1

IAsyncResult предоставляет возможность отслеживать ход асинхронного вызова, а также предоставлять «токен», который впоследствии может быть передан методу «Complete___» пары асинхронных методов, которые вы обычно видите.

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

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

1

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

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

0

Из-за классической реализации асинхронного шаблона.

IAsyncResult объект возвращается из Begin метода и представляет собой простую асинхронную операцию. Он содержит методы и свойства, обеспечивающие доступ к некоторой базовой информации об асинхронной операции.

0

Выполнение асинхронного вызова - это попросить кого-то пойти и сделать что-то по своему усмотрению. IAsyncResult является дескриптором этого запроса. Вы можете использовать его для ожидания завершения задачи, запроса прогресса и получения результата и/или исключения из задачи. Что бы предпочли вместо этого?

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