在后台C#WPF中运行多个函数

时间:2013-12-09 11:17:34

标签: c# wpf

我有多个需要在后台运行的功能 这些函数基本上读取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分钟后会自动调用这些功能。 请帮助我,我做错了什么?

2 个答案:

答案 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页面,以获取有关正确实施它的更多帮助。