C#-Four模式在异步执行中

时间:2009-11-23 18:07:39

标签: c# 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)上述代码实现的模式是什么?

2)你能解释一下代码,我该如何实现其余的代码??

3 个答案:

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