У меня есть «кнопка остановки процесса» ToolStripButton
в родительской форме MDI.Из дочерней формы я запускаю процесс в фоновом потоке, используя TPL, и получаю задачи, возвращающие статус и изменяющий пользовательский интерфейс соответственно.Событие Click
'кнопки остановки процесса' обрабатывается с помощью delegate
, который работает хорошо.Тем не менее, я не могу удалить это.Пожалуйста, смотрите код ниже:
private void buttonRunValid_Click(object sender, EventArgs e)
{
// UI.
mainForm.stopButton.Enabled = true;
// Thread cancellation.
cancelSource = new CancellationTokenSource();
token = cancelSource.Token;
// Start new parallel task and pass uiScheduler.
Task<bool> asyncValidationTask = new Task<bool>(state =>
asyncRunValidationProcess(uiScheduler, token, ref timeSpan),
"Running Validation Process");
asyncValidationTask.Start();
// Callback for cancellation.
asyncValidationTask.ContinueWith(task =>
{
// Do some error checking with task.Status...
// Remove delegate (back on uiThread).
mainForm.stopButton.Click -= delegate
{
UtilsTPL.CancelRunningProcess(ref mainForm, asyncValidationTask, cancelSource);
};
return;
}, TaskScheduler.FromCurrentSynchronizationContext());
// Handle the cancellation.
mainForm.stopButton.Click += delegate
{
UtilsTPL.CancelRunningProcess(ref mainForm, asyncValidationTask, cancelSource);
};
return;
}
, где mainForm
- это MdiParent
, а stopButton
- это метод доступа к mainForm
ToolStripButton
, который запускает событие процесса отмены / остановки.
Я пытаюсь удалить delegate
в методе продолжения задач, но это не работает.Я также попытался перебрать все события, содержащиеся в ToolStripButton
, используя отражение:
FieldInfo fieldInfo =
typeof(Control).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
object obj = fieldInfo.GetValue(_stripButton);
PropertyInfo propertyInfo =
_stripButton.GetType().GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);
EventHandlerList list = (EventHandlerList)propertyInfo.GetValue(_stripButton, null);
list.RemoveHandler(obj, list[obj]);
Это также не работает.Как я могу удалить EventHandler
/ delegate
?