2009-08-05 2 views
1

У меня есть таймер в приложении с графическим интерфейсом (только значок уведомления), который контролирует определенные условия (например, если выполняется процесс), и когда эти условия выполняются, я должен создать крючок (SetWinEventHook). Проблема в том, что крючок должен быть создан на основном потоке, иначе мой обратный вызов не будет возвращен.Доступ к основной теме из Timers.Timer в .NET

Как это сделать? Я пробовал все, и единственный способ, которым это сработало, - использовать System.Windows.Forms.Timer, но я не хочу, чтобы мой контрольный таймер работал в том же потоке, что и мое приложение, поэтому я хочу использовать таймеры. Таймер или Threading.Timer.

ответ

1

Если у вас есть GUI-менее приложение, которое вы должны использовать System.Threading.Timer

Comparing the Timer Classes in the .NET Framework Class Library

Если вы хотите событие таймера для доступа к управлению UI, то вам нужно Маршаллу на поток пользовательского интерфейса используя Invoke().

+0

Я уже изучал это сравнительное, я основывал свои тесты на этом. В моем приложении нет элемента управления пользовательского интерфейса, я просто должен выполнить метод в основном потоке, чтобы на нем был создан мой крюк. Luiz Borges – 2009-08-05 02:57:50

0

При запуске приложения создайте статическую переменную для хранения ссылки на объект формы Windows. Если вы действительно начинаете поток из основного, вы также можете передать ссылку на объект формы в поток в качестве параметра.

EDIT: На самом деле вам нужен только статический, если вам нужны потоки для доступа к объекту после его создания. В противном случае вы должны иметь возможность передать ссылку на форму как параметр почти во всех случаях.

т.е.

internal static System.Windows.Form mainForm; 

public static void Main(string[] args) 
{ 
    mainForm = new NotifyIconApplication(); 

    //start thread here. 

    Application.Run(mainForm); 
} 

Вашего поток теперь может получить доступ к ссылке на ваш MainForm.

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

internal void MyMethod(object params) 
{ 
    if(this.InvokeRequired) 
    { 
     //This causes your hook creation to run on the forms thread 
     this.Invoke(DelegateToMyMethod, params); 
    } 
    else 
    { 
     //Create hook. 
    } 
} 
Смежные вопросы