2014-09-10 3 views
0

Предположим, у вас есть типичный асинхронной дизайн-шаблон API, который имеетКак вызвать Async API синхронно?

  1. метод, который называется Start, которая запускает процесс ASync
  2. обратного вызова, который вызывается, когда процесс завершает

Как бы вы вызывать этот API синхронно с помощью .NET 3.5 без блокировки насоса сообщений во время вызова?

+0

Конечно, вам нужно что-то заблокировать, если вы хотите его синхронно - вы можете сделать это легко, используя «ManualResetEvent», который вы установили в обратном вызове (может, конечно, быть лямбда/замыкание), и вы просто '.Wait 'для этого. – Carsten

+1

Почему вы хотите вызвать эту функцию в синхронном fashon? Также вызов чего-то синхронно буквально означает« Заблокировать до тех пор, пока он не завершится », поэтому, если вы не блокируете поток пользовательского интерфейса, который работает на насосе сообщений, что вы делаете хотите заблокировать? Можете ли вы, пожалуйста, обновить свой вопрос с указанием предполагаемого использования o Эта функция даст нам гораздо лучшую картину того, что вы пытаетесь выполнить. –

+0

@scottchamberlain: предположим, что в этом API нет синхронной функции. – Denis

ответ

1

Если вы хотите дождаться результата (синхронный вызов), но не хотите блокировать насос сообщений (при условии, что вы имеете в виду поток пользовательского интерфейса), вам нужно будет использовать отдельный поток для выполнения вызова (и ждать его)

Используя асинхр и ждать:

// current thread is the UI thread 
// so create/use a Task to wait for the call 
var task = Task.Factory.StartNew(() => { DoJobAsync().Wait()}); 

поток пользовательского интерфейса создает задачу (T1) и возвращает немедленно. T1 работает в другом потоке. Этот поток вызывает асинхронную функцию (возвращает другую задачу T2), поэтому дождаться результата асинхронных вызовов T1 Wait on T2.

Это довольно надуманный:

  1. намереваюсь асинхронного метода должен быть выполнен асинхронно, вероятно, потому, что это займет некоторое время, чтобы закончить.
  2. Задача T1 позволяет пользовательскому интерфейсу продолжить следующие строки вызывающего кода (против использования async/await из потока пользовательского интерфейса, который регистрирует продолжение. Но теперь вам может понадобиться получить резулькс от T1 каким-либо другим способом.
+0

У меня только .NET 3.5 нет async/await. Как вы это сделаете в .NET 3.5? – Denis

+0

@Denis - в .NET 3.5 вы, скорее всего, будете использовать обратный шаблон – Carsten

+0

@denis - это зависит от API, который вы используете. Если вы сами создаете потоки, вы можете использовать thread.join для ожидания потока. Или, если внутренняя функция устанавливает waithandle, вы можете дождаться этого. Если внутренняя функция принимает обратный вызов, установите waithandle в обратном вызове и дождитесь этого –

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