Я реализую библиотеку с некоторыми методами APM, которые выполняют асинхронный ввод-вывод. (Чтобы избавиться от него, я не могу использовать Tasks, async/await, Rx, сторонние библиотеки и т. Д.)Обертка операции APM в другой операции APM
Скажите, что один из моих методов библиотеки APM, BeginOuter()
, просто откладывает на другой метод APM, BeginInner()
, чтобы выполнить его асинхронный ввод-вывод. Есть ли причина, по которой я не могу повторно использовать внутренний IAsyncResult
от BeginInner()
как внешний IAsyncResult
от BeginOuter()
, если все остальное, что я делаю с вводом пользователя, синхронно? Такие, как:
// Omitting non-APM parameters for clarity; assume these methods do synchronous work on some other input.
public IAsyncResult BeginOuter(InputStuff stuff, AsyncCallback callback, object state)
{
return BeginInner(stuff, result =>
{
callback(result);
}, state);
}
public OutputStuff EndOuter(IAsyncResult result)
{
EndInner(result);
// Do some synchronous work to get OutputStuff.
return MakeOutputStuff();
}
Очевидно, что если BeginOuter()
были цепочкой вместе несколько асинхронных вызовов, чтобы делать свою работу, было бы ошибкой передать абоненту обратно только первый, чтобы ждать. Но что, если есть только один асинхронный вызов?
Кроме того, в моем случае, нет ничего, что я могу думать о том, что абонент может испортить после BeginInner()
завершается успешно, но, прежде чем они называют - они собираются быть в зависимости от результатов , чтобы сделать что-нибудь полезное.
Просто трудно интегрировать всю информацию об этом, что есть. Я видел несколько реализаций шаблона IAsyncResult, но я не могу много узнать об этом конкретном случае использования, кроме: http://mtaulty.com/communityserver/blogs/mike_taultys_blog/archive/2005/02/21/5279.aspx Хотелось бы лучше понять тонкости.
Edit: Я видел this question, но ответы в то время, когда я проверял все были «использовать [библиотека]», «сделать это по-другому», или «реализовать IAsyncResult» (но не вдаваясь в почему). Я пытаюсь понять, если это когда-либо приемлемо, или если реализация IAsyncResult - единственная игра в городе.
К сожалению, я забыл передать параметр состояния в моем псевдокоде. Исправлено, спасибо. Когда вы говорите «если код, который я добавляю, не блокирует» - вы имеете в виду только длительную операцию блокировки здесь? Предположим, что MakeOutputStuff() работает очень быстро и не выполняет никаких дополнительных операций ввода-вывода и т. Д. – user1454265
Да, я просто хочу избежать атак, которые должны быть «асинхронными». –