问题描述
听说异步执行有四种模式.
I heard that there are four patterns in asynchronous execution.
异步委托执行有四种模式:轮询、等待完成、完成通知和即发即弃"
当我有以下代码时:
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) 上面代码实现的模式是什么?
1) What is the pattern the above code implemented ?
2) 你能解释一下代码吗,我该如何实现其余的..?
2) Can you explain the code ,how can i implement the rest ..?
推荐答案
您拥有的是轮询模式.在这种模式中,你不断地问我们到了吗?"while
循环正在执行阻塞操作.Thread.Sleep
防止进程占用 CPU 周期.
What you have there is the Polling pattern. In this pattern you continually ask "Are we there yet?" The while
loop is doing the blocking. The Thread.Sleep
prevents the process from eating up CPU cycles.
等待完成是我会打电话给你"的方法.
Wait for Completion is the "I'll call you" approach.
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
,您就会阻塞直到攀爬完成.您可以在阻塞之前执行其他任务.
So as soon as WaitOne
is called you are blocking until climbing is complete. You can perform other tasks before blocking.
通过完成通知,您是在说你给我打电话,我不会给你打电话."
With Completion Notification you are saying "You call me, I won't call you."
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
将被通知.
There is no blocking here because Callback
is going to be notified.
而火和遗忘将是
data.BeginInvoke(null, null);
//don't care about result
这里也没有阻塞,因为你不在乎攀登结束.顾名思义,你忘记了它.你是在说别给我打电话,我不会给你打电话,但还是别给我打电话."
There is also no blocking here because you don't care when climbing is finished. As the name suggests, you forget about it. You are saying "Don't call me, I won't call you, but still, don't call me."
这篇关于C# - 异步执行中的四种模式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!