Могу ли я разместить обработчик событий мыши в отдельном потоке? - PullRequest
4 голосов
/ 02 марта 2011

Можно ли поместить поток в обработчик событий мыши?

Calls_Calls.MouseUp += new MouseEventHandler(Calls_Calls_MouseUp);

Как добавить поток поверх этого?

Ответы [ 3 ]

3 голосов
/ 02 марта 2011

Я бы настроил обработчик событий таким же образом, но в методе Calls_Calls_MouseUp вы можете запустить поток для выполнения работы:

private void Calls_Calls_MouseUp(object sender, MouseEventArgs e)
{
    ThreadPool.QueueUserWorkItem(state => {
       // do the work here
    });
}

Однако обычно я пытаюсь получить событиеобработчики настолько незаметны, насколько это возможно, просто вызывая какой-то другой метод, часто основанный на некотором условии:

private void Calls_Calls_MouseUp(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        DoSomething();
    }
}

private void DoSomething()
{
    ThreadPool.QueueUserWorkItem(state => {
       // do the work here
    });
}

Это дает вам возможность вызывать точно такое же поведение из чего-то другого, чем событие MouseUp в определенномконтроль (так что вы можете иметь такое же поведение на элемент меню, кнопку на панели инструментов и, возможно, обычную кнопку команды).Это также может открыть возможность проведения модульных тестов функциональности (хотя это несколько сложнее с асинхронным кодом).

1 голос
/ 02 марта 2011

вы также можете использовать BackgroundWorker для этого на случай, если вам потребуется какое-либо обновление пользовательского интерфейса для выполнения и завершения.

1 голос
/ 02 марта 2011
Calls_Calls.MouseUp+= new MouseEventHandler(delegate(System.Object o, System.EventArgs e) { new Thread(Calls_Call_MouseUp).Start(); });

должно работать на вас.Если вы получаете ошибки в скобках, исправьте их, так как я написал код вручную :):)

...