簡體   English   中英

異步/等待vs線程方案

[英]Async/Await vs Threads Scenario

我是C#的新手,我想知道在哪種情況下使用Async / Await以及何時使用線程,因為我了解Async / Await不會創建新線程。

例如,如果我想在接下來的十個小時中每小時安排一次打印問候,則應使用以下兩種打印方法中的哪一種?

    private async void PrintHelloAsync(int delay)
    {
        await Task.Delay(delay);
        Console.WriteLine("Hello");
    }

    private void PrintHelloThread(int delay)
    {
        Task.Run(async () =>
        {
            await Task.Delay(delay);
            Console.WriteLine("Hello");
        });
    }

我應該以增加的延遲調用10次PrintHelloAsync還是PrintHelloThread?

我什至正確使用了這些並發概念?

現在,我正在一個項目中,我需要在6 PM、9PM和Midnight安排任務,並試圖找出最好的方法。

這兩個函數之間的主要區別在於,第一個函數是由調用線程執行的,而第二個函數是由線程池中的空閑線程調用的。

有人用stackoverflow向我解釋了一次隱喻的區別(可惜我不知道他的名字了)。

假設你想做早餐。 您需要烤面包和煮雞蛋。

您可以在烤面包機中放一些面包,等到烤面包為止,從烤面包機中取出烤面包,然后開水。 水燒開后,您就可以添加雞蛋了,請稍等片刻,然后從水中取出雞蛋,然后將火熄滅。 這是同步執行的典型示例。

另一方面,將面包放入烤面包機后,您可能已經開始沸騰水了。 等到烤面包或水沸騰為止。 在第一種情況下,您將取出面包,等待水沸騰。 在后一種情況下,您需要將雞蛋放入水中,等到烤面包或雞蛋准備好為止。 一旦必須等待某些事情發生,就四處看看是否可以做其他事情來加快處理速度:這是異步執行的典型示例,但仍然由一個線程執行。 這是async-await使用的方法,這是您的第一個函數使用的方法。

最昂貴的方法是雇用一名廚師,當您開始加熱水煮一些雞蛋時,您將命令他烤些面包:由多個線程同時進行處理。

如果您有一個僅做一件事的線程,那么如果該線程雇用一名廚師來做事情並讓該線程等待直到廚師准備好,那是不明智的:為什么不讓該線程去做事情呢?

因此,如果您的線程無事可做,請使用第一個函數。

但是,僅當線程在異步函數本身中運行時才能調用第一個函數。 如果線程不在異步函數中,並且在烘烤面包時它可以做一些有意義的事情,請考慮使用第二種方法。

我認為最終的目標是將任務安排在下午6點,下午9點等位置。在不做過多詳細說明的情況下,您可能會走錯路(延遲任務並考慮線程問題)。 相反,我建議您查看Windows服務中托管的調度程序系統(例如Quartz.netHangFire) ,或者僅使用Windows任務調度程序在特定時間啟動應用程序。

如果您別無選擇,只能自己實現調度系統,那么我將以System.Timers.Timer類作為起點:

using System;
using System.Threading.Tasks;
using System.Timers;

class Example
{
    static void Main()
    {
        Timer timer = new Timer(1000);
        timer.Elapsed += async ( sender, e ) => await HandleTimer();
        timer.Start();
        Console.Write("Press any key to exit... ");
        Console.ReadKey();
    }

    private static Task HandleTimer()
    {
        Console.WriteLine("Timer event");
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM