[c#] أين يتم إلغاء رمي المهمة غير المتزامن إذا لم يتم انتظاره؟



Answers

يمكنني استخدام طريقة تمديد لمعالجة الخطأ العام على Task . يوفر هذا طريقة لتسجيل كل الأخطاء والقيام بعمل مخصص في حالة حدوث خطأ.

public static async void ErrorHandle(this Task task, Action action = null)
{
    try
    {
        await task.ConfigureAwait(false);
    }
    catch (Exception e)
    {
        Log.Error(e);
        if (action != null)
            action();
    }
}

أنا أميل إلى استخدامه عندما أفعل "النار وننسى" Task :

Task.Run(() => ProcessData(token), token).ErrorHandle(OnError);
Question

لدي المثال التالي: (يرجى أيضا قراءة التعليقات في التعليمات البرمجية، لأنها ستكون أكثر منطقية)

public async Task<Task<Result>> MyAsyncMethod() 
{
    Task<Result> resultTask = await _mySender.PostAsync();
    return resultTask; 

    // in real-life case this returns to a different assembly which I can't change
   // but I need to do some exception handling on the Result in here
}

دعونا نفترض الأسلوب mySender _ mySender يشبه هذا:

public Task<Task<Result>> PostAsync() 
{
  Task<Result> result = GetSomeTask(); 
  return result;
}

السؤال هو:

كما أنا لا تنتظر Result الفعلية في MyAsyncMethod وإذا كان أسلوب PostAsync رمي استثناء، في السياق الذي هو الاستثناء الذي سيتم طرحه والتعامل معها؟

و

هل هناك أي طريقة يمكنني التعامل مع الاستثناءات في بلدي التجمع؟

وفوجئت أنه عندما حاولت تغيير MyAsyncMethod إلى:

 public async Task<Task<Result>> MyAsyncMethod() 
{
  try 
  {
    Task<Result> resultTask = await _mySender.PostAsync();
    return resultTask; 
  }
  catch (MyCustomException ex) 
  {
  } 
}

تم القبض على الاستثناء هنا، الحدث إذا لم يكن هناك انتظار للنتيجة الفعلية. يحدث أن نتيجة PostAsync متاحة بالفعل والاستثناء هو طرح في هذا السياق الصحيح ؟؟

هل من الممكن استخدام ContinueWith للتعامل مع الاستثناءات في الصف الحالي؟ فمثلا:

public async Task<Task<Result>> MyAsyncMethod() 
{
    Task<Result> resultTask = await _mySender.PostAsync();
    var exceptionHandlingTask = resultTask.ContinueWith(t => { handle(t.Exception)}, TaskContinuationOptions.OnlyOnFaulted);
    return resultTask;
}





Links