BackgroundWorker - Время отчета - PullRequest
       2

BackgroundWorker - Время отчета

1 голос
/ 14 декабря 2011

У меня есть элемент управления в моем графическом интерфейсе, который я хотел бы сделать видимым только в случае, когда я запускаю BackgroundWorkers (много разных операций). Некоторые из этих операций длятся менее 500 мсек, и я чувствую, что делать элемент управления видимым в течение столь короткого времени бесполезно. Поэтому я хотел бы сделать элемент управления видимым, только если BackgroundWorker уже работает в течение 500 мс.

Ответы [ 3 ]

1 голос
/ 14 декабря 2011

Просто запустите таймер в то же время, когда вы запускаете BGW:

    private void button1_Click(object sender, EventArgs e) {
        timer1.Enabled = true;
        backgroundWorker1.RunWorkerAsync();
    }

    private void timer1_Tick(object sender, EventArgs e) {
        timer1.Enabled = false;
        myControl1.Visible = true;
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
        timer1.Enabled = myControl1.Visible = false;
    }
0 голосов
/ 14 декабря 2011

Вы можете использовать Timer внутри BackgroundWorker и вызывать метод ReportProgress по истечении 500 мс.

В потоке пользовательского интерфейса вам просто нужно обработать ProgressChanged событие и показать / скрыть свой контроль, как требуется.

public partial class Form1 : Form
{
    /// <summary>
    /// Timer.
    /// </summary>
    private Timer timer = new Timer();

    /// <summary>
    /// Initializes a new instance of the <see cref="Form1"/> class.
    /// </summary>
    public Form1()
    {
        InitializeComponent();

        backgroundWorker1.WorkerReportsProgress = true;
        backgroundWorker1.DoWork += BackgroundWorker1DoWork;
        backgroundWorker1.ProgressChanged += BackgroundWorker1ProgressChanged;

        timer.Interval = 500;
        timer.Tick += TimerTick;
    }

    /// <summary>
    /// Handles the Tick event of the timer control.
    /// </summary>
    /// <param name="sender">The source of the event.</param>
    /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
    void TimerTick(object sender, EventArgs e)
    {
        timer.Enabled = false;
        backgroundWorker1.ReportProgress(99);
    }

    /// <summary>
    /// Handles the Click event of the button1 control.
    /// </summary>
    /// <param name="sender">The source of the event.</param>
    /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
    private void Button1Click(object sender, EventArgs e)
    {
        timer.Enabled = true;
        backgroundWorker1.RunWorkerAsync();
    }

    /// <summary>
    /// Handles the DoWork event of the backgroundWorker1 control.
    /// </summary>
    /// <param name="sender">The source of the event.</param>
    /// <param name="e">The <see cref="System.ComponentModel.DoWorkEventArgs"/> instance containing the event data.</param>
    private void BackgroundWorker1DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;

        // Do your work...
        Thread.Sleep(2000);
    }

    /// <summary>
    /// Handles the ProgressChanged event of the backgroundWorker1 control.
    /// </summary>
    /// <param name="sender">The source of the event.</param>
    /// <param name="e">The <see cref="System.ComponentModel.ProgressChangedEventArgs"/> instance containing the event data.</param>
    private void BackgroundWorker1ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        label1.Visible = (e.ProgressPercentage == 99);
    }
}
0 голосов
/ 14 декабря 2011

Использование метода ReportProgress на BackgroundWorker.Вы можете поместить все, что хотите, в параметр состояния, а затем выполнить соответствующее вычисление.

public class MyObject
{
    public DateTime TimeStarted {get; set;}
}

Затем в вашем ProgressChanged обработчике событий ...

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    if(DateTime.Now.Subtract(((MyObject)e.UserState).TimeStarted).TotalMilliseconds > 500)
    {
         //show your control
    }
}
...