我有多个需要在后台运行的功能
这些函数基本上读取RSS XML提要并将提要数据保存到在线数据库,问题是当这些功能执行时整个应用程序都会卡住。
我想要它不应该卡住,整个应用程序应该表现正常。
我试过后台工作者(可能是我以错误的方式实现了它)
这是代码:
BackgroundWorker bw;
public HomePage()
{
InitializeComponent();
bw = new BackgroundWorker();
bw.WorkerReportsProgress = true;
bw.WorkerSupportsCancellation = true;
bw.DoWork += bw_DoWork;
DispatcherTimer d = new System.Windows.Threading.DispatcherTimer();
d.Tick += new EventHandler(dispatcherTimer_Tick);
d.Interval = new TimeSpan(0, 15, 0);
d.Start();
}
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
if (!this.bw.IsBusy)
{
bw.RunWorkerAsync();
}
}
void bw_DoWork(object sender, DoWorkEventArgs e)
{
DoWork();
}
void DoWork()
{
try
{
System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(
delegate()
{
this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(
delegate()
{
SaveRSSFeed(); // This is the function, and this function call other functions
}
));
}
));
thread.IsBackground = true;
thread.Start();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
注意: 15分钟后会自动调用这些功能。 请帮助我,我做错了什么?
答案 0 :(得分:2)
您的主题将所有的工作委托给UI线程(this.Dispatcher.Invoke
)。只需要“调用”访问UI元素。
此外,从BackgroundWorker
开始一个线程有点不寻常。
答案 1 :(得分:2)
正如@JeffRSon正确指出的那样,未正确实施了BackgroundWorker
...当使用BackgroundWorker
时,我们让 it 负责启动和运行Thread
... 的工作,不是你的。我们的想法是简化Thread
的使用。请尝试将其用作DoWork
方法:
private void DoWork()
{
SaveRSSFeed(); // This is the function, and this function call other functions
}
请查看MSDN上的BackgroundWorker
Class页面,以获取有关正确实施它的更多帮助。