Pertanyaan Pada akhir metode async, apakah saya harus kembali atau menunggu?


Pada akhir metode async Task-return, jika saya memanggil metode async lain, saya juga bisa await atau return tugasnya. Apa konsekuensi masing-masing?

    Task FooAsync()
    {
        return BazAsync();  // Option A
    }

    async Task BarAsync()
    {
        await BazAsync(); // Option B
    }

32
2017-07-26 16:58


asal


Jawaban:


Anda tidak dapat mengembalikan tugas jika metode itu sendiri dinyatakan async - jadi ini tidak akan berfungsi, misalnya:

async Task BarAsync()
{
    return BazAsync(); // Invalid!
}

Itu akan membutuhkan jenis kembalinya Task<Task>.

Jika metode Anda hanya melakukan sedikit pekerjaan dan kemudian menelepon hanya satu metode async, maka opsi pertama Anda baik-baik saja, dan berarti ada satu tugas yang lebih sedikit yang terlibat. Anda harus menyadari bahwa ada pengecualian yang dilemparkan dalam diri Anda sinkronis Metode akan dikirimkan secara bersamaan - memang, ini adalah bagaimana saya lebih suka menangani validasi argumen.

Ini juga merupakan pola umum untuk menerapkan overloading mis. dengan token pembatalan.

Ketahuilah bahwa jika Anda perlu mengubah untuk menunggu sesuatu yang lain, Anda harus menjadikannya sebagai metode asinkron. Sebagai contoh:

// Version 1:
Task BarAsync()
{
    // No need to gronkle yet...
    return BazAsync();
}

// Oops, for version 2 I need to do some more work...
async Task BarAsync()
{
    int gronkle = await GronkleAsync();
    // Do something with gronkle

    // Now we have to await BazAsync as we're now in an async method
    await BazAsync();
}

31
2017-07-26 17:03



Lihat tautan ini di mana dideskripsikan: http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx

async Task<int> TaskOfTResult_MethodAsync()
{
    int hours;
    // . . .
    // The body of the method should contain one or more await expressions.

    // Return statement specifies an integer result.
    return hours;
}

    // Calls to TaskOfTResult_MethodAsync from another async method.
private async void CallTaskTButton_Click(object sender, RoutedEventArgs e)
{
    Task<int> returnedTaskTResult = TaskOfTResult_MethodAsync();
    int intResult = await returnedTaskTResult;
    // or, in a single statement
    //int intResult = await TaskOfTResult_MethodAsync();
}






// Signature specifies Task
async Task Task_MethodAsync()
{
    // . . .
    // The body of the method should contain one or more await expressions.

    // The method has no return statement.  
}

    // Calls to Task_MethodAsync from another async method.
private async void CallTaskButton_Click(object sender, RoutedEventArgs e)
{
    Task returnedTask = Task_MethodAsync();
    await returnedTask;
    // or, in a single statement
    //await Task_MethodAsync();
}

2
2017-07-26 17:01