2013-02-11 20 views
0

我正在開發一個應用程序,它加載一些url,解析它們,將它們保存到sqlite數據庫中,UI將讀取保存的數據並在控件中顯示它們。這一進程應該在幾乎無窮循環中完成。爲了快速響應,我打算從主線程中的數據庫中讀取數據,並讓其他線程(後臺工作者)加載數據並將其插入數據庫。在dispatchertimer中運行讀取和寫入過程是否合乎邏輯並且可能?在主線程中運行一個計時器,而在後臺工作者中運行另一個計時器?如何?或者有沒有人有更好的主意?在Windows Phone的後臺工作人員使用計時器

main thread: 
    DispatcherTimer _Timer1 = new DispatcherTimer(); 
       _Timer1.Interval = _Interval; 
       _Timer1.Tick += _Timer1_Tick; 
    void _Timer1_Tick(object sender, EventArgs e) 
      { 
       // read data from db and show in controls 
      } 

secondary thread: 
    private void bw_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker worker = sender as BackgroundWorker; 
     DispatcherTimer _Timer2 = new DispatcherTimer(); 
       _Timer2.Interval = _Interval; 
       _Timer2.Tick += _Timer2_Tick; 


    } 
    void _Timer2_Tick(object sender, EventArgs e) 
      { 
       // write data into db 
      } 
    } 
+0

你有工作的樣本嗎?只是爲了正確地知道問題。 – 2013-02-11 13:32:25

+0

@Doc Roms:我已經編輯了這個問題,現在你可能會明白我在說什麼。這聽起來合乎邏輯嗎?有沒有更好的辦法? – Finutv 2013-02-11 13:53:50

+1

我想頻繁地運行db中的讀寫操作,並能夠在第一次運行後停止定時器或者在間隔時間內改變 – Finutv 2013-02-11 13:56:21

回答

1

你打算做什麼都行不通。

您的_Timer1_Tick_Timer2_Tick都將在UI線程中運行。如果您在那裏執行一些長時間運行的操作,它將掛起用戶界面。

我不明白,爲什麼你需要定時器呢?除了測量時間間隔,使用定時器來做其他事情很少是一個好策略。你可以例如在後臺的無限循環中運行更新過程,只要它將新數據放入數據庫中,您可以調用Dispatcher.BeginInvoke(傳遞您想要的任何數據)來通知UI線程,它應該使用新的可用數據更新自己。

順便說一下,對於像「發送HTTP請求,等待響應,解析,存儲,重複」這樣的任務,新的異步/等待功能是一個很自然的選擇。對於WP7,功能可用作Visual Studio 2010的「異步CTP」可再發行組件包,對於WP8,它已經集成到框架中。不過,這兩者之間存在一些兼容性問題。

1

加載某些URL,解析它們,將它們保存到sqlite的DB和UI將讀取保存的數據,並顯示在控制

請不要那樣做。不要創建自己的線程管理系統,只是不要。我並不是說它不會奏效,但它最有可能以最可怕和莫名其妙的方式逆火。比如使用一個DisptacherTImer,因爲它在UI線程上運行,所以完全爆炸。如果您確實想要使用線程考慮ThreadPool.QueueUserWorkItem()Task.Run()來啓動「即燃即用」操作。

您的工作流程也很奇怪,我不明白爲什麼您需要將您已有的數據寫入數據庫,然後將其讀回來,然後才能使用它。使用反序列化的數據將其順序寫入數據庫並將其呈現給用戶界面是否更有意義?考慮到您已經擁有數據,而不是進行涉及磁盤I/O的不必要的循環?

您是否考慮過在您的應用中使用Messaging?這是一個非常有名的MVVM模式,在MVVM Light中被實現爲Messenger類,在PRISM中被用作EventAggregator。在我看來,你的系統有一條消息「可以從服務中獲得新數據」,該消息有兩個訂戶:寫入數據庫並更新UI。

+0

句子不明確。通過說UI讀取保存的數據,我的意思是我解析後保存的數據。所以你只要想象我有寫和讀過程,其中讀取是在UI線程和寫在輔助線程。 – Finutv 2013-03-05 12:37:23