【问题标题】:Is there an ExecuteWhenThisThreadIsIdle method?是否有 ExecuteWhenThisThreadIsIdle 方法?
【发布时间】:2018-02-07 11:28:22
【问题描述】:

我遇到过好几次了。我的应用收到一些事件(例如WndProc)并且需要快速返回。需要运行的代码需要一些时间,并且不需要在从事件处理程序返回之前执行。

我目前的解决方案是在短时间内启动一个计时器,然后在 Tick 事件中运行该代码。

但是对于这种情况,这似乎是错误的工具,并且容易出现一些错误(例如多次运行代码)。

那么,有没有ExecuteWhenThisThreadIsIdle的方案?

编辑

C#/.NET 解决方案是最好的,但也欢迎使用特定于框架的解决方案。 主要是 Winforms。(还有 WPF、UWP、Xamarin.Forms 等)

代码需要与事件处理程序在同一线程上运行。 (通常是 UI 线程。)

【问题讨论】:

  • 为什么不直接使用Task.Run 创建一个Task,一旦系统有可用资源,默认TaskScheduler(在另一个线程上)就会运行该Task?
  • @CamiloTerevinto 因为代码需要在与事件处理程序相同的线程上运行。 (我想我会把它编辑成问题。)谢谢。我现在编辑了它。
  • 在这种情况下,您需要添加相关的 UI 框架标签(WPF、WinForms、WebForms?)
  • 解决方案很可能取决于所使用的框架。这个问题应该缩小范围。
  • 问题是,AFAIK,不同框架之间的同步上下文以完全不同的方式工作(这是我从查看类的理解,不过,希望有更多的支持知识渊博的人),所以我不确定那里是否有可以跨平台工作的东西

标签: c# .net wpf winforms


【解决方案1】:

在WinForms中,您可以订阅Application.Idle

例如...

private bool _wndProcEventHooked = false;

protected override void WndProc(ref Message m) {
    // Run your code here
}

private void Application_Idle(Object sender, EventArgs e) { 
    if (!this._wndProcEventHooked) {
        // Hook your wndProc event here.
        this._wndProcEventHooked = true;
    }
}

【讨论】:

    【解决方案2】:

    在 WPF 中这个 can be done 使用 DispatcherTimer:

    var timer = new DispatcherTimer
        (
        TimeSpan.FromMinutes(10),
        DispatcherPriority.ApplicationIdle,// Or DispatcherPriority.SystemIdle
        (s, e) => MessageBox.Show("Timer"),
        Application.Current.Dispatcher
        );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      相关资源
      最近更新 更多