Роль делегата AsyncCallback

Вместо того чтобы спрашивать у делегата о том, завершил ли выполняться вызванный асинхронно метод, гораздо эффективнее заставить вторичный поток информировать вызывающий поток об окончании выполнения задачи. При желании обеспечить такое поведение, необходимо предоставить методу Beginlnvoke(), которому до сих пор передавалось просто значение null, в качестве параметра экземпляр делегата System.AsyncCallback. В таком случае этот делегат будет вызывать указанный метод

автоматически сразу же по завершении асинхронного вызова.

Как и любой делегат, AsyncCallback может вызывать только те методы, которые

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

// Целевые методы AsyncCallback должны

// соответствовать следующему шаблону:

void MyAsyncCallbackMethod(IAsyncResult itfAR)

Давайте создадим другое приложение, в котором будет использоваться делегат

BinaryOp. На этот раз не будем просить делегата выяснять, закончилось ли выполнение

метода Add(), а вместо этого определим метод AddComplete() для получения уведомления об окончании асинхронного вызова:

namespace AsyncCallbackDelegate

{

public delegate int BinaryOp(int x, int y);

class Program

{

static void Main(string[] args)

{

Console.WriteLine("***** AsyncCallbackDelegate Example *****");

Console.WriteLine ("Mam () invoked on thread {0}.",

Thread.CurrentThread. ManagedThreadId);

BinaryOp b = new BinaryOp(Add);

IAsyncResult iftAR = b.BeginInvoke(10, 10,

new AsyncCallback(AddComplete), null);

// Здесь выполняется другая работа...

Console.ReadLine();

}

static void AddComplete(IAsyncResult itfAR)

{

Console.WriteLine("AddComplete() invoked on thread {0}.",

Thread.CurrentThread.GetHashCode());

Console.WriteLine("Your addition is complete"); // сложение выполнено

}

static int Add(int x, int y)

{

Console.WriteLine("Add() invoked on thread {0}.",

Thread.CurrentThread. ManagedThreadId);

Thread.Sleep(1000);

return x + y;

}

}

}

Обратите внимание, что статический метод AddComplete() будет вызываться

делегатом AsyncCallback сразу же по окончании выполнения метода Add(). Запустив

приложение, можно удостовериться, что вторичный поток будет осуществлять обратный

вызов AddComplete(), как показано на рис. 2.

Рис. 2. Делегат AsyncCallback в действии


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: