c# - 后台工作人员在指定时间后停止工作

标签 c# multithreading timer backgroundworker stopwatch

我已经解决了几十个问题和教程,但最终却一无所获
我希望得到你们的帮助。

我有一个BW,正在做一些繁重的工作(提供服务,将它们保存到文件中)。
BW在运行时初始化,并通过单击按钮启动。这是完美的,但是事情是不间断的,或者直到单击事件btn_cancel从而停止BW为止。

我想要实现的是通过单击按钮再次启动bw_doWork,但是只能在指定的时间段内工作。第一次完成doWork()最多需要30秒,然后大约需要10秒。我尝试使用秒表,但到目前为止没有成功。

到目前为止,我的代码如下所示:

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_点击
private void btnServiceLoad_Click(object sender, EventArgs e)
        {
           // sw.Start();
            if (backgroundWorker1.IsBusy != true)
            {
                this.backgroundWorker1.RunWorkerAsync();
            }
            ReadServicesFromFile();
        }

最佳答案

通过以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;
    }
}

http://ideone.com/PcvCRB上提供文件.Designer.cs的GUI代码

关于c# - 后台工作人员在指定时间后停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30754814/

相关文章:

java - testng 中的并行方法执行仅执行从类中调用的最后一个方法

c# - 定时器比间隔时间多 10 毫秒

C# 代码将使用 for 循环创建的文本框的值传递到另一个页面

c# - 如何在返回对象的 ASP.NET Core WebAPI Controller 中抛出异常?

objective-c - 为什么我对 NSLock 的使用不起作用?

c++ - 用 std::thread 替代 WaitForMultipleObjects?

javascript - 如果 JavaScript 计时器正在运行,则防止 session 超时

flutter - 在 flutter 中的 CircularProgressIndicator 上显示计时器进度

c# - 通过C#从网站获取特定内容

c# - Entity Framework 6 Fluent 映射 - 一对多代码优先