TPL: periksa apakah tugas salah dalam acara OnCompleted

Saya mempunyai tugas seperti:

var migrateTask = Task.Run(() =>
    {
        //do stuff
     });

migrateTask.ConfigureAwait(true).GetAwaiter().OnCompleted(this.MigrationProcessCompleted);

Bagaimana cara mengetahui dalam metode MigrationProcessCompleted jika saya mendapat pengecualian atau tugas salah di thread awal (di blok kode do stuff)?

Apakah ada cara untuk menemukan ini tanpa menjadikan tugas sebagai anggota/properti kelas?


person Buda Gavril    schedule 27.10.2016    source sumber
comment
Mengapa Anda mendapatkan penunggu dan tidak menggunakan Task.ContinueWith?   -  person Scott Chamberlain    schedule 27.10.2016
comment
karena saya perlu menjalankan MigrationProcessCompleted di thread UI   -  person Buda Gavril    schedule 27.10.2016
comment
Dan bisakah Anda menggunakan await?   -  person Scott Chamberlain    schedule 27.10.2016
comment
ya, saya bisa menggunakannya. Ini adalah pengalaman pertama saya dengan tugas.   -  person Buda Gavril    schedule 27.10.2016


Jawaban (1)


Anda tidak boleh memanggil .GetAwaiter() karena ini dimaksudkan untuk penggunaan kompiler.

Jika Anda dapat menggunakan await kode Anda sesederhana

public async Task YourFunc()
{

    Exception error = null
    try
    {
        await Task.Run(() =>
        {
            //do stuff
         });
    }
    catch(Exception ex)
    {
        error = ex;
    }

    MigrationProcessCompleted(error)
}

private void MigrationProcessCompleted(Exception error)
{
     //Check to see if error == null. If it is no error happend, if not deal withthe error.
}
person Scott Chamberlain    schedule 27.10.2016
comment
Dalam hal ini, dalam kode di dalam blok run terdapat pengecualian, apakah kode tersebut akan ditangkap di blok catch? Karena saya pernah mendengar bahwa pengecualian tidak dilempar ketika itu terjadi... - person Buda Gavril; 27.10.2016
comment
await menyebabkannya tertangkap oleh blok tangkapan. jika Anda telah melakukan Task.Run tanpa await maka Anda benar. - person Scott Chamberlain; 27.10.2016