【问题标题】:Accessing main thread from a Timers.Timer in .NET从 .NET 中的 Timers.Timer 访问主线程
【发布时间】:2009-08-05 02:38:59
【问题描述】:

我在一个无 GUI 的应用程序(仅通知图标)中有一个计时器,它监视某些条件(例如进程是否正在运行),当满足这些条件时,我必须创建一个挂钩 (SetWinEventHook)。问题是钩子必须在主线程上创建,否则我的回调没有返回。

如何做到这一点?我已经尝试了所有方法,唯一可行的方法是使用 System.Windows.Forms.Timer,但我不希望我的监视计时器与我的应用程序在同一个线程中运行,所以我想使用 Timers。计时器或 Threading.Timer。

【问题讨论】:

    标签: c# .net multithreading timer


    【解决方案1】:

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

    Comparing the Timer Classes in the .NET Framework Class Library

    如果您希望计时器事件访问 UI 控件,则需要使用 Invoke() 编组到 UI 线程。

    【讨论】:

    • 我已经研究过这个比较,我的测试以此为基础。我的应用程序中没有 UI 控件,我只是在主线程上执行一个方法,以便在其上创建我的 Hook。路易斯·博尔赫斯
    【解决方案2】:

    当您的应用程序启动时,创建一个静态变量来存储对 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.
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多