Требуется ли вызов AsyncOperation.PostOperationCompleted? - PullRequest
0 голосов
/ 04 декабря 2008

Я использую класс AsyncOperation, чтобы не писать тонны методов "if (control.InvokeRequired) then / else" (в отличие от его традиционной роли в асинхронном шаблоне на основе событий). В некоторых случаях мне не важно получать уведомление о завершении рабочего потока. Из-за этого я не хотел бы вызывать метод PostOperationCompleted на моем AsyncOperation, поскольку для этого потребовалось бы написать обратный вызов бездействия.

Мне любопытно, стоит ли пропустить вызов на PostOperationCompleted. В документации указывается, что она завершает время жизни операции и делает дальнейшие вызовы недействительными. Она не дает понять, имеет ли жизненное значение внутреннее поведение, связанное с этим вызовом. Это несколько намекает на то, что для пропуска вызова могут быть внутренние последствия, но, в конце концов, я не вижу убедительных рекомендаций, чтобы всегда его вызывать.

Итак, я должен считать плохой практикой пропуск вызова или нет ничего сложного?

Ответы [ 2 ]

1 голос
/ 26 июля 2009

Owen,

Если вы знаете, что в вашей ситуации вам не нужно возвращать маршалинг обратно в исходный поток вызывающих абонентов, вам следует просто вызвать OperationCompleted. Между вашей операцией и лежащим в ее основе SynchronizationContext подразумевается простой конечный автомат. Это само по себе не будет проблемой, если вы знаете, что после того, как ваша работа прекратилась, она не используется из остальной части вашего приложения. Хотя на самом деле это нормально, с программной точки зрения необходимо учитывать следующее:

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

  2. Ключевым аспектом завершения операции является удаление объекта из списка финализаторов. Для одного или двух экземпляров это может не быть проблемой, но вы наверняка понизите производительность, если число этих операций велико, так как вы позволите продвигаться всем этим экземплярам AsyncOperation, и GC придется выполнять больше работы. Поэтому вам следует хотя бы вызвать OperationCompleted, чтобы избежать этого.

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

НТН

Ник.

0 голосов
/ 13 марта 2009

Документация для PostOperationCompleted гласит: «Объект AsyncOperation гарантирует, что ваш делегат будет вызван в потоке или контексте, подходящем для модели приложения». Это очень важно, если ваш поток GUI должен что-то сделать после завершения фоновой операции. Я думаю, что это, пожалуй, самая важная причина для использования этого класса!

Ура, Дан :) 1003 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...