Подтвердить что ты не робот

Как реализовать событие отмены в С#

Я знаю, что в С# есть несколько встроенных событий, которые передают параметр ( "Отмена" ), который, если установлен в true, остановит дальнейшее выполнение в объекте, который поднял событие.

Как бы вы реализовали событие, в котором объект подъема мог отслеживать свойство в EventArgs?

Вот пример WinForms того, что я пытаюсь сделать:
http://msdn.microsoft.com/en-us/library/system.componentmodel.canceleventargs.cancel.aspx

Спасибо.

4b9b3361

Ответ 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).