איך BackgroundWorker.Cancellation ממתינים לברגה?

הדרך לבטל פעולת BackgroundWorker היא להתקשר אל BackgroundWorker.CancelAsync () :

// RUNNING IN UI THREAD
private void cancelButton_Click(object sender, EventArgs e)
{
    backgroundWorker.CancelAsync();
}

בטיפול באירועים BackgroundWorker.DoWork, אנו בודקים BackgroundWorker.CancellationPending :

// RUNNING IN WORKER THREAD
void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    while (!backgroundWorker.CancellationPending) {
        DoSomething();
    }
}

הרעיון הנ"ל נמצא בכל רחבי הרשת, כולל ב- דף MSDN של BackgroundWorker .

עכשיו, השאלה שלי היא כזו: איך לכל הרוחות החוט הזה בטוח?

בחנתי את מחלקת הרקע עובד ב- ILSpy - CancelAsync () פשוט מגדיר את הביטול בהמתנה לאמיתי ללא שימוש במחסום זיכרון, ו ביטול בהמתנה פשוט מחזיר את הביטול בהמתנה מבלי להשתמש במחסום הזיכרון.

על פי דף ג'ון סקיט זה , האמור לעיל אינו בטוח . אך בתיעוד של BackgroundWorker.CancellationPending נכתב, "מאפיין זה מיועד לשימוש על ידי שרשור העובד, שעליו לבדוק מעת לעת את ביטול ההמתנה ולבטל את פעולת הרקע כאשר היא מוגדרת כ- true."

מה קורה פה? האם זה בטוח בחוטים או לא?

22
задан skaffman 7 August 2011 в 11:32
поделиться