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