C# – asynchronous执行中的四种模式

我听说asynchronous执行中有四种模式。

“asynchronous委托执行中有四种模式:轮询,等待完成,完成通知和”火与遗忘“。

当我有以下代码:

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)你能解释一下这个代码吗,我该如何实现其余的…?

你有什么是轮询模式。 在这种模式中,你不断地问:“我们到了吗?” while循环正在阻塞。 Thread.Sleep可以防止进程占用CPU周期。


等待完成是“我会打电话给你”的方法。

 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被调用,你就会阻塞,直到WaitOne 。 您可以在阻止之前执行其他任务。


通过Completion Notification,你会说“你打电话给我,我不会给你打电话”。

 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 

这里也没有阻挡,因为攀爬结束时你不在乎。 顾名思义,你忘了它。 你在说:“不要打电话给我,我不会打电话给你,但是,不要打电话给我。”

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

这是经典的投票。 – 检查,睡觉,再次检查,

这个代码是轮询:

 while (!ar.IsCompleted) 

这是关键,你不断检查它是否完成。

这个代码并不是真的支持全部四个,但是有一些代码。

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

“开始”方法是asynchronous。 它催生了一个新的过程。

我们可以使用这个代码来执行你请求的每一种方式:

 // 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();