从.NET中的Timers.Timer访问主线程

时间:2009-08-05 02:38:59

标签: c# .net multithreading timer

我在一个没有GUI的app(仅通知图标)中有一个Timer来监视某些条件(比如Process正在运行),当满足这些条件时,我必须创建一个钩子(SetWinEventHook)。问题是必须在主线程上创建钩子,否则我的回调不会返回。

怎么做?我已经尝试了所有的东西,唯一的方法是使用System.Windows.Forms.Timer,但我不希望我的监视计时器在与我的应用程序相同的线程中运行,所以我想使用Timers。计时器或线程。计时器。

2 个答案:

答案 0 :(得分:1)

如果你有一个没有GUI的应用程序,你应该使用System.Threading.Timer

Comparing the Timer Classes in the .NET Framework Class Library

如果您希望timer事件访问UI控件,则需要使用Invoke()对UI线程进行编组。

答案 1 :(得分:0)

当app启动时,创建一个静态变量来存储对windows表单对象的引用。 如果您实际从main启动线程,您还可以将表单对象引用作为参数传递给线程。

编辑:实际上,如果您需要线程在创建对象后访问该对象,则只需要静态。否则,您几乎可以在几乎所有情况下都将表单引用作为参数传递。

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.
    }
}