后台工作人员在指定时间后停止工作
Backgroundworker to stop work after specified time
我已经检查了几十个问题和教程,但最终一无所获
我希望能得到你们的帮助。
我有一个 BW,正在做一些繁重的工作(升级服务,将它们保存到一个文件中)。
BW 在 运行 时间初始化,并通过单击按钮启动。这工作得很好,但问题是它会不停地工作,或者直到事件 btn_cancel
被点击停止 BW。
我想要实现的是通过单击按钮再次启动我的 bw_doWork
,但只在指定的时间段内工作。第一次,doWork()
最多需要 30 秒才能完成,然后大约需要 10 秒。我尝试使用 Stop Watch,但到目前为止没有成功。
到目前为止,我的代码如下所示:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// Do not access the form's BackgroundWorker reference directly.
// Instead, use the reference provided by the sender parameter.
long targetTime = (long) e.Argument;
Stopwatch sw = new Stopwatch();
if (targetTime > 0)
{
sw.Start();
}
while (true)
{
if ((targetTime > 0) && (sw.ElapsedMilliseconds >= targetTime))
{
BackgroundWorker bw = sender as BackgroundWorker;
while (!bw.CancellationPending)
{
GetServicesToFile();
}
sw.Reset();
sw.Start();
}
}
}
btn_Click
private void btnServiceLoad_Click(object sender, EventArgs e)
{
// sw.Start();
if (backgroundWorker1.IsBusy != true)
{
this.backgroundWorker1.RunWorkerAsync();
}
ReadServicesFromFile();
}
通过 System.Windows.Forms.Timer
管理此事件,该 System.Windows.Forms.Timer
与 BackgroundWorker
一起开始,您可以自由初始化其延迟,并且其第一个 Tick
事件取消 BackgroundWorker
。您也可以使用按钮取消。有帮助吗?
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
public partial class TimedBGWTest:Form {
static int p=0;
static Timer t;
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new TimedBGWTest());
}
public TimedBGWTest() {
InitializeComponent();
t=new Timer() { Interval=2000 };
t.Tick+=t_Tick;
}
// Buttons
private void buttonStart_Click(object sender,EventArgs e) {
t.Stop();
t.Start();
if(bgw.IsBusy) return;
buttonCancel.BackColor=Color.IndianRed;
buttonCancel.Enabled=true;
}
private void buttonCancel_Click(object sender,EventArgs e) {
bgw.CancelAsync();
t.Stop();
}
// Timer
void t_Tick(object sender, EventArgs e) {
bgw.CancelAsync();
(sender as Timer).Stop();
}
// Background worker
private void bgw_DoWork(object sender,DoWorkEventArgs e) {
while(!bgw.CancellationPending) {
if(++p>100) p=0;
bgw.ReportProgress(p);
System.Threading.Thread.Sleep(200);
}
}
private void bgw_ProgressChanged(object sender,ProgressChangedEventArgs e) {
progressBar1.Value=e.ProgressPercentage;
}
private void bgw_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e) {
buttonCancel.BackColor=Color.LightGray;
buttonCancel.Enabled=false;
}
}
文件 .Designer.cs
的 GUI 代码可在 http://ideone.com/PcvCRB
获得
我已经检查了几十个问题和教程,但最终一无所获 我希望能得到你们的帮助。
我有一个 BW,正在做一些繁重的工作(升级服务,将它们保存到一个文件中)。
BW 在 运行 时间初始化,并通过单击按钮启动。这工作得很好,但问题是它会不停地工作,或者直到事件 btn_cancel
被点击停止 BW。
我想要实现的是通过单击按钮再次启动我的 bw_doWork
,但只在指定的时间段内工作。第一次,doWork()
最多需要 30 秒才能完成,然后大约需要 10 秒。我尝试使用 Stop Watch,但到目前为止没有成功。
到目前为止,我的代码如下所示:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// Do not access the form's BackgroundWorker reference directly.
// Instead, use the reference provided by the sender parameter.
long targetTime = (long) e.Argument;
Stopwatch sw = new Stopwatch();
if (targetTime > 0)
{
sw.Start();
}
while (true)
{
if ((targetTime > 0) && (sw.ElapsedMilliseconds >= targetTime))
{
BackgroundWorker bw = sender as BackgroundWorker;
while (!bw.CancellationPending)
{
GetServicesToFile();
}
sw.Reset();
sw.Start();
}
}
}
btn_Click
private void btnServiceLoad_Click(object sender, EventArgs e)
{
// sw.Start();
if (backgroundWorker1.IsBusy != true)
{
this.backgroundWorker1.RunWorkerAsync();
}
ReadServicesFromFile();
}
通过 System.Windows.Forms.Timer
管理此事件,该 System.Windows.Forms.Timer
与 BackgroundWorker
一起开始,您可以自由初始化其延迟,并且其第一个 Tick
事件取消 BackgroundWorker
。您也可以使用按钮取消。有帮助吗?
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
public partial class TimedBGWTest:Form {
static int p=0;
static Timer t;
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new TimedBGWTest());
}
public TimedBGWTest() {
InitializeComponent();
t=new Timer() { Interval=2000 };
t.Tick+=t_Tick;
}
// Buttons
private void buttonStart_Click(object sender,EventArgs e) {
t.Stop();
t.Start();
if(bgw.IsBusy) return;
buttonCancel.BackColor=Color.IndianRed;
buttonCancel.Enabled=true;
}
private void buttonCancel_Click(object sender,EventArgs e) {
bgw.CancelAsync();
t.Stop();
}
// Timer
void t_Tick(object sender, EventArgs e) {
bgw.CancelAsync();
(sender as Timer).Stop();
}
// Background worker
private void bgw_DoWork(object sender,DoWorkEventArgs e) {
while(!bgw.CancellationPending) {
if(++p>100) p=0;
bgw.ReportProgress(p);
System.Threading.Thread.Sleep(200);
}
}
private void bgw_ProgressChanged(object sender,ProgressChangedEventArgs e) {
progressBar1.Value=e.ProgressPercentage;
}
private void bgw_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e) {
buttonCancel.BackColor=Color.LightGray;
buttonCancel.Enabled=false;
}
}
文件 .Designer.cs
的 GUI 代码可在 http://ideone.com/PcvCRB