• WPF优化:加速启动时间


    其实严格来说这个应该不算是优化的内容,昨天我做了一个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





  • 相关阅读:
    14、python基础
    13、Python入门
    12、运算符、流程控制
    10、Linux(六)
    Windows 分层窗口 桌面上透明 Direct3D
    Windows 进程间通信 共享内存
    Linux 库的使用
    FFmpeg 命令行
    FFmpeg 摄像头采集
    FFmpeg input与output 函数流程
  • 原文地址:https://www.cnblogs.com/luacloud/p/2265738.html
Copyright © 2020-2023  润新知