С# -Четыре шаблона в асинхронном исполнении

Я слышал, что в асинхронном выполнении есть четыре шаблона.

"В выполнении асинхронного делегирования есть четыре шаблона: опрос, ожидание завершения, уведомление о завершении и" огонь и забвение ".

Когда у меня есть следующий код:

class AsynchronousDemo
{
    public static int numberofFeets = 0;
    public delegate long StatisticalData();

    static void Main()
    {
        StatisticalData data = ClimbSmallHill;
        IAsyncResult ar = data.BeginInvoke(null, null);
        while (!ar.IsCompleted)
        {
            Console.WriteLine("...Climbing yet to be completed.....");
            Thread.Sleep(200);

        }
        Console.WriteLine("..Climbing is completed...");
        Console.WriteLine("... Time Taken for  climbing ....{0}", 
        data.EndInvoke(ar).ToString()+"..Seconds");
        Console.ReadKey(true);

    }


    static long ClimbSmallHill()
    {
        var sw = Stopwatch.StartNew();
        while (numberofFeets <= 10000)
        {
            numberofFeets = numberofFeets + 100;
            Thread.Sleep(10);
        }
        sw.Stop();
        return sw.ElapsedMilliseconds;
    }
}

1) Каков шаблон, реализованный выше кодом?

2) Можете ли вы объяснить код, как я могу реализовать остальные...?

Ответ 1

У вас есть шаблон опроса. В этой схеме вы постоянно спрашиваете: "Мы еще там?" Цикл while выполняет блокировку. Thread.Sleep не позволяет процессу переваривать циклы процессора.


Ожидание завершения - это подход "Я позвоню".

IAsyncResult ar = data.BeginInvoke(null, null);
//wait until processing is done with WaitOne
//you can do other actions before this if needed
ar.AsyncWaitHandle.WaitOne(); 
Console.WriteLine("..Climbing is completed...");

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


С уведомлением о завершении вы говорите: "Вы называете меня, я не позвоню вам".

IAsyncResult ar = data.BeginInvoke(Callback, null);

//Automatically gets called after climbing is complete because we specified this
//in the call to BeginInvoke
public static void Callback(IAsyncResult result) {
    Console.WriteLine("..Climbing is completed...");
}

Здесь нет блокировки, потому что Callback будет уведомляться.


И огонь и забыть были бы

data.BeginInvoke(null, null);
//don't care about result

Здесь также нет блокировки, потому что вам все равно, когда лазание закончено. Как следует из названия, вы забываете об этом. Вы говорите: "Не называй меня, я не позвоню тебе, но все равно не позвони мне".

Ответ 2

while (!ar.IsCompleted)
{
    Console.WriteLine("...Climbing yet to be completed.....");
    Thread.Sleep(200);
}

Это классический опрос. - Проверить, спать, снова проверить,

Ответ 3

Этот код является опросом:

while (!ar.IsCompleted)

В этом ключе вы продолжаете проверять, завершено ли оно.

Этот код действительно не поддерживает все четыре, но какой-то код делает.

Process fileProcess = new Process();
// Fill the start info
bool started = fileProcess.Start();

Метод "Старт" является асинхронным. Он запускает новый процесс.

Мы можем выполнить каждый из способов, которые вы запрашиваете с помощью этого кода:

// Fire and forget
// We don't do anything, because we've started the process, and we don't care about it

// Completion Notification
fileProcess.Exited += new EventHandler(fileProcess_Exited);

// Polling
while (fileProcess.HasExited)
{

}

// Wait for completion
fileProcess.WaitForExit();