是否有ExecuteWhenThisThreadIsIdle方法?

时间:2018-02-07 11:28:23

标签: c# .net wpf winforms

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

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

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

那么,有没有ExecuteWhenThisThreadIsIdle计划?

修改

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

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

2 个答案:

答案 0 :(得分:2)

在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;
    }
}

答案 1 :(得分:1)

在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
    );