我听说异步执行有四种模式。
异步委托执行中有四种模式:轮询,等待完成,完成通知和“消防并忘记”
当我有以下代码时:
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)你能解释一下代码,我该如何实现其余的代码??
答案 0 :(得分:93)
你有什么轮询模式。在这种模式中,你不断问“我们还在吗?” 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
,你就会阻止攀爬完成。您可以在阻止之前执行其他任务。
完成通知后,您说“你给我打电话,我不会打电话给你。”
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
这里也没有阻挡,因为攀爬完成后你并不在乎。顾名思义,你会忘记它。你说的是“不要打电话给我,我不会打电话给你,但是,不要打电话给我。”
答案 1 :(得分:3)
while (!ar.IsCompleted)
{
Console.WriteLine("...Climbing yet to be completed.....");
Thread.Sleep(200);
}
那是经典民意调查。 - 检查,睡觉,再次检查,
答案 2 :(得分:1)
此代码为轮询:
while (!ar.IsCompleted)
这是关键,你一直在检查它是否已经完成。
这些代码并不真正支持所有四种代码,但有些代码可以支持。
Process fileProcess = new Process();
// Fill the start info
bool started = fileProcess.Start();
“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();