Как реализовать событие отмены в С#
Я знаю, что в С# есть несколько встроенных событий, которые передают параметр ( "Отмена" ), который, если установлен в true, остановит дальнейшее выполнение в объекте, который поднял событие.
Как бы вы реализовали событие, в котором объект подъема мог отслеживать свойство в EventArgs?
Вот пример WinForms того, что я пытаюсь сделать:
http://msdn.microsoft.com/en-us/library/system.componentmodel.canceleventargs.cancel.aspx
Спасибо.
Ответы
Ответ 1
Это очень просто.
private event _myEvent;
// ...
// Create the event args
CancelEventArgs args = new CancelEventArgs();
// Fire the event
_myEvent.DynamicInvoke(new object[] { this, args });
// Check the result when the event handler returns
if (args.Cancel)
{
// ...
}
Ответ 2
Вот как я могу избежать вызова дополнительных подписчиков, когда один из них утверждает, что отменить:
var tmp = AutoBalanceTriggered;
if (tmp != null)
{
var args = new CancelEventArgs();
foreach (EventHandler<CancelEventArgs> t in tmp.GetInvocationList())
{
t(this, args);
if (args.Cancel) // a client cancelled the operation
{
break;
}
}
}
Ответ 3
Мне нужен был способ остановить подписчиков от получения события после того, как абонент отменил его. В моей ситуации я не хочу, чтобы событие дальше распространялось на других подписчиков после того, как какой-то абонент отменил его.
Я реализовал это с помощью пользовательской обработки событий:
public class Program
{
private static List<EventHandler<CancelEventArgs>> SubscribersList = new List<EventHandler<CancelEventArgs>>();
public static event EventHandler<CancelEventArgs> TheEvent
{
add {
if (!SubscribersList.Contains(value))
{
SubscribersList.Add(value);
}
}
remove
{
if (SubscribersList.Contains(value))
{
SubscribersList.Remove(value);
}
}
}
public static void RaiseTheEvent(object sender, CancelEventArgs cancelArgs)
{
foreach (EventHandler<CancelEventArgs> sub in SubscribersList)
{
sub(sender, cancelArgs);
// Stop the Execution after a subscriber cancels the event
if (cancelArgs.Cancel)
{
break;
}
}
}
static void Main(string[] args)
{
new Subscriber1();
new Subscriber2();
Console.WriteLine("Program: Raising the event");
CancelEventArgs cancelArgs = new CancelEventArgs();
RaiseTheEvent(null, cancelArgs);
if (cancelArgs.Cancel)
{
Console.WriteLine("Program: The Event was Canceled");
}
else
{
Console.WriteLine("Program: The Event was NOT Canceled");
}
Console.ReadLine();
}
}
public class Subscriber1
{
public Subscriber1()
{
Program.TheEvent += new EventHandler<CancelEventArgs>(program_TheEvent);
}
void program_TheEvent(object sender, CancelEventArgs e)
{
Console.WriteLine("Subscriber1: in program_TheEvent");
Console.WriteLine("Subscriber1: Canceling the event");
e.Cancel = true;
}
}
public class Subscriber2
{
public Subscriber2()
{
Program.TheEvent += new EventHandler<CancelEventArgs>(program_TheEvent);
}
void program_TheEvent(object sender, CancelEventArgs e)
{
Console.WriteLine("Subscriber2: in program_TheEvent");
}
}
Ответ 4
Легко:
- Создайте экземпляр CancelEventArgs (или ваш собственный тип).
- Поднимите событие, передав этот экземпляр.
- Проверьте свойство Canceld на [1].
Вам нужны образцы кода?
Ответ 5
Вам нужно подождать вызова, который вызывает событие, а затем проверить флаг в EventArgs (в частности CancelEventArgs).