הדרך לבטל פעולת 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."
מה קורה פה? האם זה בטוח בחוטים או לא?