Как определить событие, а затем запустить делегата, когда событие произойдет? - PullRequest
1 голос
/ 08 февраля 2012

Я знаю, что это действительно простые вещи, но я изо всех сил пытаюсь обдумать это.

Хорошо, у меня есть метод, который я хочу запустить:

public static void DelegateTest(string testStuff)
{
    for (int i = 0; i < 4; i++)
    {
        Console.WriteLine(testStuff);
    }
}

Затем, вне области действия этого метода (но в рамках моего класса), я определяю моего делегата с тем же типом вывода и входными параметрами, что и у моего метода:

public delegate void myDelegate(string test);

Я создаю экземпляр моего делегата так:

myDelegate md = new myDelegate(DelegateTest);

Затем я могу запускать свой метод столько раз, сколько захочу, с помощью BeginInvoking делегата, и методы будут выполняться рядом в отдельных потоках.

md.BeginInvoke("Hello World", null, null);
md.BeginInvoke("Hello World Again", null, null);
md.BeginInvoke("Hello World A Third Time", null, null);

Как мне теперь определить событие и только асинхронно запускать мой метод, когда событие происходит? Кроме того, каковы ограничения на то, что может быть событие? Можно ли более или менее все, что происходит на моем компьютере, определить как событие или только определенные вещи?

Редактировать: Скажем, например, что после выполнения вышеизложенного я хочу создать событие и определить это событие как «пробел был нажат». Каждый раз, когда нажимается пробел, это событие происходит. Когда происходит событие, я хочу запустить свой метод асинхронно, я не хочу запускать свой метод асинхронно, если пробел не был нажат.

Как бы я поступил об этом?

Ответы [ 3 ]

3 голосов
/ 08 февраля 2012

Просто используйте Invoke вместо BeginInvoke для синхронных вызовов.

EDIT: согласно ответу ThePower, вам не нужен Invoke, вы можете просто вызвать свой делегат, как если бы это была функция (потому что это!).

EDIT2: Вы на самом деле пытаетесь зарегистрировать обработчик событий.Для этого вам не нужно создавать свой собственный делегат.Пример обработки события KeyPress в WinForms:

public class MyForm : Form
{
    public MyForm()
    {
        KeyPress += OnKeyPressHandler;
    }


    private void OnKeyPressHandler(object sender, KeyPressEventArgs keyPressEventArgs)
    {
     //TODO: whatever you need to do...
    }
}
1 голос
/ 08 февраля 2012

Если вы хотите использовать его как event, проверьте тип события. Вот хороший пример здесь .

Хотя, если вы хотите использовать своего делегата ...

Вы уже определили Asynchronous, поэтому для синхронного использования:

md("Hello World", null, null);
md("Hello World Again", null, null);
md("Hello World A Third Time", null, null);
0 голосов
/ 08 февраля 2012

Я не уверен, что полностью понимаю ваш вопрос. В C # для всех практических целей событие является делегатом, что означает, что любой делегат может использоваться в качестве события.

Используя ваш пример:

public delegate void MyDelegate(string test);

Теперь вы можете использовать MyDelegate как событие в классе:

public class MyClass
{
  public event MyDelegate MyEvent;
}

Теперь вы можете зарегистрировать обработчики событий с помощью MyEvent, а затем в обработчике событий вы можете выполнить любой код, какой захотите. В традиционном смысле это единственный способ определить события в C #.

Другой вариант, который следует рассмотреть, - это использование шаблона публикации / подписки, такого как EventAggregator. Этот шаблон обычно не полагается на делегатов, а вместо этого использует объект-агрегатор для уведомления всех подписчиков об опубликованном событии. В этом сценарии событием может быть любой объект, содержащий информацию, ожидаемую подписчиками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...