繁体   English   中英

如何将backgroundworker与timer和progressBar一起使用?

[英]How do i use backgroundworker with timer and progressBar?

我有一个计时器刻度线事件,它的间隔设置为10000

private void timer1_Tick(object sender, EventArgs e)
{
    Update();
}

在更新中,我有:

public int Update()
{
    counter += 1;
    int position = (int)Math.Round((counter / updateTime) * 100);
    xpProgressBar1.Text = counter.ToString() + " %";
    xpProgressBar1.Position = counter;
    if (counter == 10)
    {
        DownloadingHtml();
        ScrollNews();
        counter = 0;
    }
    return position;
}

然后在背景工作人员中进行工作:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    int position = NewsUpdate();
    object param = "report";
    backgroundWorker1.ReportProgress(position, param);
}

以及背景工作者进度事件:

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{

    xpProgressBar1.Text = e.ProgressPercentage.ToString() + " %";
    xpProgressBar1.Position = e.ProgressPercentage;
    if (counter == 10)
    {
        DownloadingHtml();
        ScrollNews();
        counter = 0;
    }
}

我要在第一步中执行的操作是,将每隔10秒通过背景工作程序调用一次Update方法。

在第二步中,我想向背景工作人员添加另一种方法:

public void ScrollNews()
{
    label3.Text = SaveOldHtml.HtmlLoadedFileNumber.ToString();
    richTextBox1.Clear();
    combindedString = string.Join(Environment.NewLine, ListsExtractions.myList);
    richTextBox1.SelectAll();
    richTextBox1.SelectionAlignment = HorizontalAlignment.Right;
    richTextBox1.Text = combindedString;
    scrollerText = string.Join(Environment.NewLine, ListsExtractions.myListWithoutLinks);
    scroller1.TextToScroll = scrollerText;
    if (NewsLevels.newsLevel && NewsLevels.shouldStart)
    {
        scroller1.Start();
        NewsLevels.shouldStart = false;
    }
    if (NewsLevels.newsLevel == false && NewsLevels.shouldStart)
    {
        scroller1.Start();
        NewsLevels.shouldStart = false;
    }
    string[] rlines = richTextBox1.Lines;
    richTextBox1.SelectionStart = 0;
    richTextBox1.SelectionLength = rlines[0].Length;
    richTextBox1.SelectionColor = Color.Red;
    richTextBox1.Select(rlines[0].Length, rlines[1].Length + 1);
    richTextBox1.SelectionColor = Color.Green;
}

从Update方法中调用ScrollNews方法,并使用文本更新richTextBox1和Scroller1。

最后,我想在Update中添加最后一个方法:

private void DownloadingHtml()
{           
    using (var webClient = new WebClient())
    {
        webClient.Encoding = System.Text.Encoding.GetEncoding(1255);
        page = webClient.DownloadString("http://rotter.net/scoopscache.html");
    }            
    StreamWriter w = new StreamWriter(@"d:\rotterhtml\rotterscoops.html");
    w.Write(page);
    w.Close();
    page = @"d:\rotterhtml\rotterscoops.html";
    listsext.Ext(page);
    count++;
}

我想从后台工作所有这些方法。

在form1构造函数中,我首先执行该操作,它将调用一次DownloadingHtml方法,然后调用一次ScrollNews方法,然后激活backgroundworker,然后启动timer1。

似乎您在滥用BackgroundWorker类。 它通常用于执行单个耗时的操作,而该操作不应阻止UI。 所有耗时的操作都应在单独的线程上执行的OnDoWork事件中进行。 报告进度在UI线程上执行,并用于更新进度栏和其他显示进度的UI元素。

timer1_Tick在UI线程上执行,并在执行时阻止UI。 如果您不希望UI挂起,那么在那里执行任何下载或处理不是一个好主意。 您可以在每个timer1_Tick执行中重新启动TPL TaskThread或仅重新启动BackgroundWorker。 然后,此TaskThread可以报​​告进度并更新当前的UI状态,从而调用表单的线程安全方法。 BackgroundWorker可以为此使用它自己的ReportProgress机制。

如果使用单独的任务或线程,则从单独的线程调用的每个方法都应检查Form的InvokeRequired并调用BeginInvoke来执行线程安全的UI更新。 此处对此进行了很好的描述: beginInvoke,GUI和线程以及许多其他类似的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM