Как бороться с условиями гонки при многопоточности?

Вот пример:

if (control.InvokeRequired)
{
    control.BeginInvoke(action, control);
}
else
{
    action(control);
}

Что делать, если между условием и вызовом BeginInvoke элемент управления удаляется, например?

Другой пример, связанный с событиями:

var handler = MyEvent;

if (handler != null)
{
    handler.BeginInvoke(null, EventArgs.Empty, null, null);
}

Если MyEvent отменяется между первым строка и оператор if, оператор if все равно будет выполняться. Однако правильный ли это дизайн? Что, если с отказом от подписки также произойдет разрушение состояния, необходимого для правильного вызова события? В этом решении не только больше строк кода (шаблон), но и оно не так интуитивно понятно и может привести к неожиданным результатам на стороне клиента.

Что ты скажешь, ТАК?

5
задан Brian Gideon 27 September 2011 в 00:29
поделиться