async/await וניהול שגיאות

כלליים

New member
async/await וניהול שגיאות

הנה קוד לדוגמא:
myMethod אורך זמן ממושך, ואני עוטף אותו בtask.
הבעיה היא במקרה שמתחוללת שגיאה, הcatch איננו מופעל. אודה מאד למי שיעזור לי.
private async void Button_Click(object sender, RoutedEventArgs e) {
string s;
try { s = await myMethodeAsync(); } catch { s = "error"; } } async Task<string> myMethodeAsync() { string result = await Task.Run(() => myMethod()); return result; } string myMethod() { throw new Exception("some error"); }
 

כלליים

New member
וכמובן

אני מכיר את האפשרות הפשוטה: להפוך את myMethod לTask.
אבל לעיתים המתודה שאני רוצה להריץ היא מספריה חיצונית, ולכן אני מחפש פתרון כללי להריץ מתודות בצורה אסינכרונית, עם ניהול שגיאות.
 

Royi Namir

New member
הקוד עובד אצלי - הוא כן מגיע ל CATCH.

http://i.stack.imgur.com/suyAY.jpg

לגבי מה שאמרת "אבל לעיתים המתודה שאני רוצה להריץ היא מספריה חיצונית" :

זה לא משנה . אתה יכול כל מתודה להריץ ב TASK על ידי TASKCOMPLETIONSOURCE
 

כלליים

New member
אינני יודע למה אצלי לא

אני עובד על vs pre, דוטנט 4.5.
לגבי שאר הדברים, אלמד ואנסה.

 

Royi Namir

New member
אתה מריץ את זה ב DEBUG

תריץ את זה ב בלי DEBUG ותראה שהוא לא יעצור
ההודעה שאתה רואה זה מה DEBUG .
 

כלליים

New member
גם בrelease

אותה תוצאה

אבל, תוך כדי המשחקים החלפתי את הtask.run בtask.fromresult, והפעם הcatch מופעל!
אני מקווה שזה פתרון טוב ואינני מפספס משהו.
 

Royi Namir

New member
FromResult משתמש ב TCS

הנה הקוד מREFLECTOR

internal static Task<TResult> FromResult<TResult>(TResult result){
TaskCompletionSource<TResult> source = new TaskCompletionSource<TResult>();
source.SetResult(result); return source.Task;}

מחזיר TASK
עד שלא תתבצע המודה , ה TASK יהיה UNRESOLVED.

לא יודע בדיוק מה הולך לך שם , אבל גם בדיקה ב LINQPAD מראה אותה ה CATCH כן נקרא.
 

HackPoint

New member
בוא נחשוב למה?

התשובה היא פשוטה, שכאשר אתה מריץ TASK או THREAD הטיפול בשגיאות ריצה מתבצע בתוך הת'רד ולא בתוך הMAIN THREAD או TASK.
לכן הם חשפו מתודה שנקראת ContinueWith היא chainable:
http://stackoverflow.com/a/12981091/586439
 

Royi Namir

New member
למה ?

אן צורך ב CONTINUE WITH
בשביל זה יש את ה AWAITABLE
טיפול ב EXCEPTIONS ב CONTINUEWITH הוא הרבה יותר מסורבל מאשר ב ASYNCAWAIT
שלא נדבר על ה CONTEXT שנשמר


קרא כאן על ה CONTEXT של EXCEPTIONS :

http://stackoverflow.com/a/13718546/859154
 

HackPoint

New member
לא הבנתי

אז אתה מסכים שלא להסכים?
אני מודע לקונטקסט, במקרה הזה לא דובר על קונטקסט.
עם שימוש בawait יש context resolving הכל נשמר פר קונטקסט, לכן הexceptio לא יצור אגרגציה עבור עוסקים הבאים. מאחר וזה נמצא תחת אותו קונטקסט ספציפי.
מפנה אותך לספר של cleary
 

Royi Namir

New member
תגיד אתה מודע למה שאתה עונה ?

התשובה שרשמת לא נכונה
אין צורך וגם לא נכון להשתמש ב continuewith
האקספשין לא יחלחל למעלה
וכפי שאתה רואה הוא שם try בראשי
הוא לא השתמש ב continue
הקוד שלו עובד כמצופה
ואת הספר של קלרי סיימתי כבר מסמן
&nbsp
 

Royi Namir

New member
עוד

אם הוא היה משתמש ב continue הוא היה צריך לבדוק את result or wait
או לבדוק tasoptions only on faulted
כל הסרבול הזה נחסך כבר בערך לפני שנתיים
כפי שאמרתי אין שום דבר פגום בקוד שלו ואני רואה שהוא כבר אישר את זה למעלה
&nbsp
 
למעלה