我如何使用后台工作与定时器和进度条
本文关键字:定时器 何使用 后台 工作 | 更新日期: 2023-09-27 18:14:03
我有一个计时器滴答事件,它的间隔设置为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;
}
}
我想在第一步中做的是,Update方法将通过backgroundworker每10秒调用一次。
在第二步中,我想给backgroundworker添加另一个方法: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;
}
ScrollNews方法正在从Update方法调用,它正在用文本更新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挂起,在那里执行任何下载或处理都不是个好主意。您可以启动TPL Task
, Thread
或在每次timer1_Tick
执行中重新启动BackgroundWorker。然后,Task
或Thread
可以报告进度并更新当前UI状态,调用form的线程安全方法。BackgroundWorker
可以使用自己的ReportProgress
机制来实现此目的。
在使用单独的任务或线程的情况下,从一个单独的线程调用的每个方法应该检查表单的InvokeRequired
和调用BeginInvoke
执行线程安全的UI更新。这在这里有很好的描述:beginInvoke, GUI和线程以及许多其他类似的问题。