С# -Четыре шаблона в асинхронном исполнении
Я слышал, что в асинхронном выполнении есть четыре шаблона.
"В выполнении асинхронного делегирования есть четыре шаблона: опрос, ожидание завершения, уведомление о завершении и" огонь и забвение ".
Когда у меня есть следующий код:
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();