Представьте, что у вас есть долгое задание, и вы можете делать только одно за раз.Обычно, чтобы сделать это, вам придется перестать делать все остальное.
// pseudocode
Main() {
DoLaundry()
GoAboutYourDay()
}
DoLaundry() {
// boring parts here
}
Теперь представьте, что вы хотите, чтобы у вас был день, когда вы делаете стирку. Одним из решений было бы заставить кого-то другого сделать это. Итак, вы отведите его в уборную, скажите им, что делать, дайте им одежду и скажите им позвонить вам, когда они будут сделаны. В свою очередь, они возвращают вам билет, чтобы они снова могли найти вашу одежду, когда захотите.
// pseudocode
Main() {
ticket = DoLaundry.BeginDoing(CallMeWhenDone)
GoAboutYourDay()
ticket.WaitUntilDone()
}
CallMeWhenDone(ticket) {
cleanLaundry = DoLaundry.FinishDoing(ticket)
}
Как работает асинхронная работа.
BeginInvoke Вы сообщаете программе, что вам нужно сделать (делегат), что вызвать, когда это будет сделано (обратный вызов), и что делать с (состоянием). Вы возвращаете IAsyncResult, который является объектом, который вам нужно вернуть, чтобы получить ваш результат. Затем вы можете делать другие вещи или использовать WaitHandle в IAsyncResult для блокировки до завершения операции.
Обратный вызов: Когда асинхронная операция завершается, он будет вызывать этот метод, предоставляя вам тот же IAsyncResult, как и раньше. На этом этапе вы можете извлечь из него свой объект состояния или передать IAsyncResult в EndInvoke.
EndInvoke: Эта функция принимает IAsyncResult и находит результат операции. Если он еще не закончен, он будет блокироваться до тех пор, пока это не произойдет, поэтому вы обычно вызываете его внутри обратного вызова.
Это шаблон, который часто используется во всей структуре, а не только для делегатов функций. Такие вещи, как соединения с базой данных, сокеты и т. Д., Часто имеют пары «Начало/конец».
MSDN содержит документацию по образцу здесь: http://msdn.microsoft.com/en-us/library/2e08f6yc(VS.71).aspx
Отлично explanation.would быть очень полезно для начинающих, как я. – user215675