其实严格来说这个应该不算是优化的内容,昨天我做了一个UI,也是相当于一个学习和复习,然后我想我做个什么啊做个什么啊。。。后来打算做个RSS采集器,用到了一个开源的叫做RSS.NET的项目,这个东西挺不错的。
然后我就在项目中引用,然后创建对象,不过我在MainWindow函数中读取了RSS。
1 private static RssFeed feed;
2 public MainWindow()
3 {
4 InitializeComponent();
5 feed = RssFeed.Read(Url);
6 }
这样做导致了一个结果就是,程序启动的时候会有一点延迟。所以我想到了后台线程执行,这样的话对程序本身的影响也会变小。
所以用到了BackgroundWorker来做这件事情,代码更改为:
1 private BackgroundWorker backgroundUpdate = new BackgroundWorker();
2 private DispatcherTimer timer = new DispatcherTimer();
3 public MainWindow()
4 {
5 InitializeComponent();
6 }
7
8 private void Window_Loaded(object sender, RoutedEventArgs e)
9 {
10 backgroundUpdate.DoWork += new DoWorkEventHandler(backgroundUpdate_DoWork);
11 backgroundUpdate.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundUpdate_RunWorkerCompleted);
12 timer.Tick += new EventHandler(timer_Tick);
13 timer.Interval = new TimeSpan(0, 0, 5); // 五秒
14 timer.Start();
15
16 }
17
18 void timer_Tick(object sender, EventArgs e)
19 {
20 if (!backgroundUpdate.IsBusy)
21 {
22 backgroundUpdate.RunWorkerAsync();
23 }
24 }
25
26 void backgroundUpdate_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
27 {
28 RssItem item = e.Result as RssItem;
29 if (item != null)
30 {
31 Run PubDate = new Run(string.Format("[{0}]", item.PubDate.ToString("yyyy-MM-dd HH:mm:ss")));
32 Run Title = new Run(item.Title);
33 Hyperlink link = new Hyperlink(Title);
34 link.RequestNavigate += new RequestNavigateEventHandler(link_RequestNavigate);
35 link.NavigateUri = item.Link;
36 tuiguang.Inlines.Clear();
37 tuiguang.Inlines.Add(new Run("[推广]"));
38 tuiguang.Inlines.Add(PubDate);
39 tuiguang.Inlines.Add(link);
40 }
41 }
42
43 void backgroundUpdate_DoWork(object sender, DoWorkEventArgs e)
44 {
45 e.Result = PushData();
46 }
47 private RssItem PushData()
48 {
49 feed = RssFeed.Read(rssuri);
50 RssChannel channel = (RssChannel)feed.Channels[0];
51 return channel.Items[0];
52 }
写程序时应尽量避免在MainWindow中写其他的操作,而且,在适当的时候将一些在后台执行的采集类的程序写在后台线程中。以加速程序的运行效率。
以上代码中注册了DoWork和RunWorkerCompleted两个事件来在后台处理数据,而且定义了一个DispatcherTimer每隔5秒便激活一次后台线程,以达到数据采集的目的,虽然代码相对来说有一点小长,但是性能上面的改善却是很明显的。
http://luacloud.com/2011/wpf-application-start-backgroundworker.html