GUI上的优先级高于计时器C#

GUI上的优先级高于计时器C#,c#,user-interface,timer,C#,User Interface,Timer,我有一个表单应用程序,里面有多个计时器,所有的计时器都在不同的时间执行任务,但是我现在开始在“不太好”的计算机上使用我的应用程序。我的问题是GUI没有得到我认为需要的时间。仅仅是一个简单的按键和一个非常小的任务可能需要相当长的时间。我觉得是“推动”本身被推迟了。那么现在我的问题是,有没有一种方法可以让GUI在计时器上运行呢?例如,如果GUI需要工作,是否跳过一个勾号?(没有一个计时器如此重要,以至于它有时不能跳过)。还是有其他方法可以让GUI正常工作? 顺便说一句,我使用的是System.Tim

我有一个表单应用程序,里面有多个计时器,所有的计时器都在不同的时间执行任务,但是我现在开始在“不太好”的计算机上使用我的应用程序。我的问题是GUI没有得到我认为需要的时间。仅仅是一个简单的按键和一个非常小的任务可能需要相当长的时间。我觉得是“推动”本身被推迟了。那么现在我的问题是,有没有一种方法可以让GUI在计时器上运行呢?例如,如果GUI需要工作,是否跳过一个勾号?(没有一个计时器如此重要,以至于它有时不能跳过)。还是有其他方法可以让GUI正常工作? 顺便说一句,我使用的是
System.Timers.Timer
,这是相对于ex-System.Windows.Forms.Timer的正确选择。

如果您使用的是WinForms,您应该使用

此计时器针对Windows窗体应用程序进行了优化,必须在窗口中使用

应用程序中是否有1个或100个计时器并不重要。重要的是你在计时器回调中做了什么(勾选处理程序)。任何花费超过“一点点”时间的代码都会给您的UI带来“迟缓”的感觉

如果您可以详细说明所有计时器的工作,并发布一些代码,我可以提供进一步的建议。

如果您使用WinForms,您应该使用

此计时器针对Windows窗体应用程序进行了优化,必须在窗口中使用

应用程序中是否有1个或100个计时器并不重要。重要的是你在计时器回调中做了什么(勾选处理程序)。任何花费超过“一点点”时间的代码都会给您的UI带来“迟缓”的感觉

如果你能详细说明你所有的定时器都在做什么,并发布一些代码,我可以提供进一步的建议。

使用线程

创建新的(单独的)线程,这将不会干扰计时器,您的任务将同时完成

但是,如果您正在处理复杂的数据,请等待所有线程完成,然后继续

我希望这会有所帮助:)

使用线程

创建新的(单独的)线程,这将不会干扰计时器,您的任务将同时完成

但是,如果您正在处理复杂的数据,请等待所有线程完成,然后继续

我希望这会有所帮助:)

我相信,那些“不太好”的计算机没有足够的资源在短时间内处理您的任务。因此,您需要多线程

这并不像听起来那么难,只要读一读就知道了。

我相信,那些“不太好”的计算机没有足够的资源在短时间内处理你的任务。因此,您需要多线程


这并不像听起来那么难,只要读一些,瞧。

如果你想在计时器事件中启动一些长任务,最好在单独的线程中完成。最短/最简单的方法如下:

ThreadPool.QueueUserWorkItem((o) => { 
    // Do lenghty stuff
    // ...
    BeginInvoke((MethodInvoker)delegate() {
       // Update UI, if necessary
    });
});
我个人不是
系统.定时器.定时器的超级粉丝。如果我的任务很长并且/或者不是gui,我更喜欢
System.Threading.Timer
,如果任务很短gui更新,我更喜欢
System.Windows.Forms.Timer
(它在gui线程上触发,所以不需要
调用任何东西)

在严格的周期计时器上启动任务的一个问题是,它会发出,发出,发出。。。即使您以前启动的任务尚未完成(除非您停止/启动它或其他类似的任务)。
System.Threading.Timer
非常方便,您可以启动它一次,然后在任务启动并完成后,再次启动它

finally {
    new System.Threading.Timer((o) => { ... }, null, 60000, 0);
}

如果您想在计时器事件中启动一些较长的任务,最好在单独的线程中完成。最短/最简单的方法如下:

ThreadPool.QueueUserWorkItem((o) => { 
    // Do lenghty stuff
    // ...
    BeginInvoke((MethodInvoker)delegate() {
       // Update UI, if necessary
    });
});
我个人不是
系统.定时器.定时器的超级粉丝。如果我的任务很长并且/或者不是gui,我更喜欢
System.Threading.Timer
,如果任务很短gui更新,我更喜欢
System.Windows.Forms.Timer
(它在gui线程上触发,所以不需要
调用任何东西)

在严格的周期计时器上启动任务的一个问题是,它会发出,发出,发出。。。即使您以前启动的任务尚未完成(除非您停止/启动它或其他类似的任务)。
System.Threading.Timer
非常方便,您可以启动它一次,然后在任务启动并完成后,再次启动它

finally {
    new System.Threading.Timer((o) => { ... }, null, 60000, 0);
}

如果我在计时器内启动一个线程,是否只是在完成时启动并关闭它?如果我在计时器内启动一个线程,是否只是在完成时启动并关闭它?