TPL: ตรวจสอบว่างานมีข้อผิดพลาดในเหตุการณ์ OnCompleted หรือไม่

ฉันมีงานเช่น:

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

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

จะบอกได้อย่างไรในวิธีการ MigrationProcessCompleted ว่าฉันได้รับข้อยกเว้นหรืองานมีข้อผิดพลาดในเธรดเริ่มต้น (ในบล็อกรหัสเนื้อหา)

มีวิธีการค้นหาสิ่งนี้โดยไม่ทำให้งานเป็นสมาชิกชั้นเรียน / ทรัพย์สินหรือไม่?


person Buda Gavril    schedule 27.10.2016    source แหล่งที่มา
comment
เหตุใดคุณจึงได้รับตัวรอและไม่ได้ใช้ Task.ContinueWith?   -  person Scott Chamberlain    schedule 27.10.2016
comment
เพราะฉันต้องดำเนินการ MigrationProcessCompleted ในเธรด UI   -  person Buda Gavril    schedule 27.10.2016
comment
และคุณสามารถใช้ await ได้หรือไม่?   -  person Scott Chamberlain    schedule 27.10.2016
comment
ใช่ ฉันสามารถใช้ได้ นี่เป็นประสบการณ์ครั้งแรกของฉันกับงาน   -  person Buda Gavril    schedule 27.10.2016


คำตอบ (1)


คุณไม่ควรเรียก .GetAwaiter() จริงๆ เพราะมีไว้สำหรับการใช้คอมไพเลอร์

หากคุณสามารถใช้ await โค้ดของคุณก็ง่ายพอๆ กัน

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
ในกรณีนี้ ในโค้ดภายใน run block จะมีข้อยกเว้น มันจะติดอยู่ใน catch block หรือไม่ เพราะฉันได้ยินมาว่าข้อยกเว้นจะไม่ถูกโยนทิ้งเมื่อมันเกิดขึ้น... - person Buda Gavril; 27.10.2016
comment
await ทำให้มันโดนบล็อกจับ ถ้าคุณทำ Task.Run โดยไม่มี await คุณก็จะถูกต้อง - person Scott Chamberlain; 27.10.2016