לדלג לתוכן

פתרון השלמות והקשרים

הדוגמה הבאה מראה consumer שמתחיל להמתין לפני פרסום התוצאה. האפשרות שנבחרה מונעת מהרצת continuation של Task זה להיכנס באופן inline לתוך SetResult, אבל worker אחר עדיין יכול לרוץ במקביל לפני ההדפסה הבאה של המפיק.

var source = new TaskCompletionSource<int>(TaskCreationOptions.RunContinuationsAsynchronously);
Task consumer = Consume(source.Task);
Console.WriteLine("before result");
source.SetResult(42);
Console.WriteLine("after result");
await consumer;

static async Task Consume(Task<int> operation)
{
    int result = await operation;
    Console.WriteLine($"consumed {result}");
}

התיקון ל־handler מופיע כקטע המחליף את המתודה בתוך מחלקת החלון. הוא אינו תוכנית console עצמאית, מפני ש־Title ו־LoadTextAsync שייכים לחלון.

private async void OnClick(object sender, System.Windows.RoutedEventArgs args)
{
    try { Title = await LoadTextAsync(); }
    catch (IOException error) { Title = error.Message; }
}

ה־dispatcher פנוי לעבד הודעות בזמן ההמתנה, ולכן ההמשך יכול לחזור אליו. הטיפול בחריגה נמצא בגבול האירוע, שהקורא שלו אינו מקבל Task. בספרייה נחזיר Task ונאפשר לשכבה שקוראת לנו להחליט אם להציג הודעה, לנסות שוב או לסיים את הפעולה. במקרה של כשל שאינו IOException תידרש מדיניות נוספת בהתאם ליישום; אין להפוך catch כללי לשיטת הסתרת באגים.