2015-04-30 3 views
0

Я реализую библиотеку с некоторыми методами 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 - единственная игра в городе.

ответ

1

Выполнение нескольких операций с синхронным кодом на одной операции.

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

Не передавать параметр state во внутреннюю операцию немного озорным - вы должны, вероятно, опустить его из вашей сигнатуры метода Begin... или передать его, если сможете.

+0

К сожалению, я забыл передать параметр состояния в моем псевдокоде. Исправлено, спасибо. Когда вы говорите «если код, который я добавляю, не блокирует» - вы имеете в виду только длительную операцию блокировки здесь? Предположим, что MakeOutputStuff() работает очень быстро и не выполняет никаких дополнительных операций ввода-вывода и т. Д. – user1454265

+0

Да, я просто хочу избежать атак, которые должны быть «асинхронными». –