C#如何在BackgroundWorker 后台线程中使用定时器?

就是说我有一项任务要用BackgroundWorker来进行异步操作,并且需要定时进行,由于定时时间比较短,只有1秒钟,所以不能使用System.Windows.Forms名字空间中的Timer来定时执行,因为它是主线程的定时器,每秒执行一次异步操作,会导致窗体反应迟钝甚至出现未响应的情况,而其他Timer怎么用呢?捣鼓好多天了都不行,那位C#高手帮帮忙,给100分

实际上,Timer并不只有你说的System.Windows.Forms.Timer一种。这个东西作为一个主线程(即UI线程)的控件,它的执行都会在UI线程,当然会造成线程阻塞,也就是你说的窗体未响应。
你可以尝试使用System.Threading.Timer,它可以实现控件Timer的一切功能。另外,和你说的System.Widnows.Forms.Timer不一样的是,它可以定义在非主线程中,当然它的定时执行方法也就不会影响到主线程了。
使用方法如下。
System.Threading.Timer timer = new System.Threading.Timer();//初始化
timer.Interval = 1000; //定时间隔1000ms
timer.Elapsed+=new EventHandler(timer_Elapsed);

private void timer_Elapsed()
{
//这里的代码每隔1秒时间就会运行,写你定时执行的事件即可
//并且,每次代码执行到这里,其实.NET内部都是用新的线程来处理这部分代码的
}

你将上面的东西封装成一个方法,注册到BackgroundWorker中,UI就不会假死的。

实际上,要在UI上定时调用异步,并且解决UI的假死,还有其他的方法,BackgroundWorker并不是唯一的选择。
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-11-23
Timer会导致窗体反应异常?
可能是你代码的问题吧?
你把代码给我看看?

其它的Timer跟Forms的Timer其实基本差不多
你也可以尝试用Thread执行一个无限循环的方法,比如:
while(true){
做事的代码
Thread.Sleep(1000);// 休眠一秒
}本回答被提问者采纳

C#如何在BackgroundWorker 后台线程中使用定时器?
timer.Elapsed+=new EventHandler(timer_Elapsed);private void timer_Elapsed(){ \/\/这里的代码每隔1秒时间就会运行,写你定时执行的事件即可 \/\/并且,每次代码执行到这里,其实.NET内部都是用新的线程来处理这部分代码的 } 你将上面的东西封装成一个方法,注册到BackgroundWorker中,UI就不会假死的。...

C#定时器线程注册一个方法给 backgroundwork实现耗时的操作?
将绘制代码块放在单独的方法,该方法的签名和EventHandler签名一致,然后订阅BackgroundWorker.DoWork 事件。调用RunWorkerAsync()方法启动。不过不建议在方法中直接处理UI,而是使用事件。具体使用方法看这里https:\/\/msdn.microsoft.com\/zh-cn\/library\/system.componentmodel.backgroundworker(v=vs.110).aspx ...

【c#】关于 BackGroundWorker 的用法讲解(附实例)
首先,为BackgroundWorker的DoWork、ProgressChanged和RunWorkerCompleted属性设置对应的事件处理器,这些处理器实际调用的函数需要满足object sender, EventArgs e的参数格式。DoWork用于启动后台任务,ProgressChanged在任务进行中更新进度,RunWorkerCompleted则在任务完成后通知主线程。在DoWork函数中,当backgroundW...

C# Threading.Timer 当执行的代码量很多的时候,如何实现
lz的这一个情况建议将那”很多很多的操作“ 全部放置于一个新建的类中,然后在这个类中放置一个ComponentModel.BackgroundWorker对象并在DoWork事件中添加对应的事件处理程序,这样时间到的时候新建一个该类实例,然后启动操作。等到处理完之后再从这一类中提取出具体数据。一般如果在主线程中timer的事件处理...

C#关于定时器和多线程中对控件的操作以及界面假死的现象。
不清楚具体原因,不过你这里面定时器没什么意义,直接用循环就行了,类似于下面的,timer2什么的代码可以删掉了,直接在formload的时候启动下面的线程 new Thread((ThreadStart)(delegate { while(true){ this.Invoke((MethodInvoker)delegate { rtxtTestResults.Text = "正在导入中"; r...

...会导致主界面很卡,线程怎么用啊?最好有点代码能参考的!
1,Timer 是根据CPU的时钟频率来触发事件,所以使用的时候要注意,如果触发的时间操作1S会导致系统性能的剧烈下降。2,关于Thread 类,可以到MSDN上查询相关代码,不过在线程获取到数据后,将数据刷新到主页面的时候会有点小麻烦。其中可能需要调用 Control.Invoke 方法.3,微软定义了一个新的控件 BackGroud...

BackgroundWorker示例代码
以下是根据要求改写后的文章内容,以HTML片段形式呈现:在C#的Windows Forms应用程序中,BackgroundWorker是一个实用工具,用于在后台执行耗时任务,如计算斐波那契数列,同时保持用户界面的响应。实例代码展示了如何初始化和使用BackgroundWorker:构造函数: 在FibonacciForm的构造函数中,初始化BackgroundWorker并...

如何使用backgroundworker实现登陆等待效果
使用这个组件其实非常简单,例如,我们做一个类似如下界面的进度条的小例子,在后台线程中进行 耗时运算,同时刷新界面上的滚动条和提示信息,运行结束后,弹出处理结果。在界面上拖入backgroundWorker组件,并响应其三个事件。代码如下:*\/ using System;using System.Collections.Generic;using System....

backgroundworker 如何取消操作?我的很小的demo程序vb.net的(c#也差...
backgroundworker控件的设置如图所示:开始和结束多线程的命令:BackgroundWorker1.RunWorkerAsync() '开启多线程 BackgroundWorker1.CancelAsync() '停止多线程

c#中如何让一个按钮去启动一个线程,点另外个按钮就能停止线程?
这个需要用到后台线程执行,否则一运行主线程就卡住了:public partial class Form1 : Form { \/\/ 打印放在后台执行 BackgroundWorker m_Worker;\/\/ 用一个标记来看是否请求停止执行 bool m_NeedRun = false;public Form1(){ InitializeComponent();m_Worker = new BackgroundWorker();m_Worker.Do...

相似回答