Menggunakan pola menunggu async dari metode statis ketika konkurensi tidak diperlukan

Apakah ada manfaat menggunakan pola async/menunggu saat Anda menjalankan sesuatu secara sinkron?

Misalnya di aplikasi saya, saya memiliki metode statis yang dipanggil oleh cron (hangfire) untuk melakukan berbagai tugas terikat IO. Contoh sederhana yang dibuat-buat adalah ini:

static void Run(string[] args)
{
    var data = Test(args);

    //..do stuff with returned data
}

public static List<string> Test(string[] args)
{
    return Db.Select(args);
}

Apakah ada keuntungan menulis kode ini seperti:

static void Run(string[] args)
{

    var dataTask = await TestAsync(args);
    dataTask.Wait();

    //..do stuff with returned data
}

public static async Task<List<string>> TestAsync(string[] args)
{
    return await Db.SelectAsync(args);
}

Rekan saya memberi tahu saya bahwa saya harus selalu menggunakan pola ini dan menggunakan metode async jika tersedia karena ia menambahkan pengoptimalan di balik terpal, tetapi dia tidak dapat menjelaskan alasannya dan saya tidak dapat menemukan penjelasan yang jelas.

Jika saya menulis kode saya dengan pola jenis ini di metode statis saya, hasilnya akan terlihat seperti:

var data = someMethod();
data.Wait();
var data2 = someOtherMethod(data);
data2.Wait();

Saya memahami penggunaan pola menunggu async ketika menjalankan banyak tugas secara bersamaan tetapi ketika kode berasal dari metode statis dan harus dijalankan secara berurutan seperti ini, apakah ada manfaatnya sama sekali? Ke arah mana saya harus menulisnya?


person Guerrilla    schedule 10.11.2018    source sumber
comment
Apakah Anda benar-benar menggabungkan await dan Wait() dalam kode produksi? Jika ya, mengapa?   -  person Peter Bons    schedule 10.11.2018
comment
ups sudah mengeditnya. Terima kasih   -  person Guerrilla    schedule 10.11.2018


Jawaban (1)


karena ia menambahkan optimasi tersembunyi tetapi dia tidak dapat menjelaskan mengapa hal itu terjadi

Sungguh menakjubkan bagi saya betapa banyak orang yang percaya bahwa async selalu merupakan pilihan terbaik namun mereka tidak dapat menjelaskan alasannya. Hal ini merupakan kesalahpahaman besar di masyarakat. Sayangnya, Microsoft mendorong gagasan ini. Saya yakin mereka melakukan ini untuk menyederhanakan panduan.

Async IO membantu dalam dua hal: 1) menyimpan thread 2) membuat aplikasi GUI lebih mudah dengan menghilangkan manajemen thread.

Sebagian besar aplikasi sama sekali tidak dibatasi oleh jumlah thread yang berjalan. Untuk aplikasi tersebut, async IO tidak menambahkan throughput, memerlukan CPU tambahan, dan memperumit kode. Saya tahu, karena saya telah mengukur throughput dan skalabilitas. Saya telah mengerjakan banyak aplikasi.

Khususnya, IO itu sendiri tidak menjadi lebih cepat. Satu-satunya hal yang berubah adalah cara panggilan dimulai dan diselesaikan. Tidak ada optimasi IO apa pun di sini.

Gunakan async jika Anda merasa nyaman atau Anda memiliki bukti bahwa jumlah thread yang berjalan akan menjadi masalah. Jangan gunakan ini secara default karena produktivitas akan lebih rendah. Ada cara tambahan untuk menambahkan bug. Perkakasnya lebih buruk, kodenya lebih panjang, proses debug dan pembuatan profil lebih sulit.

Tentu saja tidak ada salahnya menggunakannya jika itu adalah alat yang tepat untuk pekerjaan itu.

person usr    schedule 10.11.2018