2013-05-11 6 views
3

Я программирую в .net WPF.Отмена асинхронного вызова (IAsyncResult)

У меня есть (сторонний) API, который реализует асинхронный шаблон вызова Begin/End. Функция BeginWork() возвращает IAsyncResult.

Однако не существует видимого метода отмены/прерывания вызова после его завершения.

Есть ли способ прекратить такую ​​работу? Если для этого требуется, чтобы автор библиотеки явно указывал на метод отмены, то каким способом можно убить эту работу, даже беззастенчиво? Мне действительно нужно как-то остановить это, так как одна работа может занять несколько часов!

Спасибо!

+0

Ну, что конкретный API? Но: если они не обнародуют отмену, я бы не предположил, что вы можете отменить ее. –

+0

@ilansch мне непонятно, что сообщение WCF обязательно будет применяться здесь ... Есть много асинхронных/IAsyncResult API, и они ведут себя по-другому –

+0

Это загрузка S3 от Amazon. Но вчера я задал конкретный вопрос об этой библиотеке и не получил ответа. Поэтому я вместо этого подумал об общем способе убить асинхронную задачу. http://stackoverflow.com/questions/16485629/s3-multipart-upload-how-can-i-cancel-one – Palantir

ответ

3

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

Если бы я был ты, я бы (один из):

  • спросить 3 участника для поддерживаемого отмены API
  • не начать его, если вы не уверены, что
+1

Также стоит отметить, что @Palantir может поддерживать логическую отмену, в результате чего он смотрит на пользователя так, как будто операция была отменена, когда на самом деле она все еще работает в фоновом режиме, и результат будет отброшен, когда он в конечном итоге завершится. –

+0

Это может работать, если операция достаточно быстрая. Но если операция может занять несколько часов, то, к сожалению, она больше не приемлема :( – Palantir

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