鍍金池/ 問答/C#  數(shù)據(jù)庫  網(wǎng)絡(luò)安全/ winform多線程抓取數(shù)據(jù)如何更新數(shù)據(jù)庫?

winform多線程抓取數(shù)據(jù)如何更新數(shù)據(jù)庫?

情況是怎樣的,我用多線程Task去抓取數(shù)據(jù),抓到數(shù)據(jù)后該如何存數(shù)據(jù)庫?數(shù)據(jù)庫是sqlite。
1、開始我想直接在task里存數(shù)據(jù)庫,但是在多線程的情況下,就會出現(xiàn)多個線程同時操作一個數(shù)據(jù)庫文件,不知道會不會沖突,數(shù)據(jù)庫能承受的最大連接數(shù)是多少?
2、后來我想單獨開個線程只存數(shù)據(jù)庫,所有Task里的數(shù)據(jù)都交給這個數(shù)據(jù)庫線程??墒俏也恢涝趺磳崿F(xiàn)。

下面是偽代碼

//主線程
private void button1_Click(object sender, EventArgs e){

    for(int i = 0; i < 10000; i++){
        var task = new Task(dataTask,i);
        task.Start();
    }
}

// task方法
private void dataTask(object obj){
    int i = (int)obj;
    List<string> list = new List<string>();  //抓取到的數(shù)據(jù)信息
    //模擬抓取數(shù)據(jù)
    Thread.Sleep(1000);
    list.Add("A"+i);
    list.Add("B"+i);
    list.Add("C"+i);
    //委托更新ui,這里沒有寫代碼
    this.BeginInvoke(updateUI, i);
    //如何把list存數(shù)據(jù)庫?
    //需要用到線程池嗎?
    //如何處理多線程的情況?
    //???
}

謝謝各位能給點意見?

回答
編輯回答
憶往昔
  1. 雖然你是多線程抓取數(shù)據(jù),但是你操作sqlite的client是同一個,對于sqlite來說,只有一個連接,只是你在多線程里插入的時候,順序是不能保證的,因為client是搶占式的
  2. 你可以把數(shù)據(jù)放到線程安全的數(shù)據(jù)集中,例如,ConcurrentQueue
2017年6月6日 14:18
編輯回答
瞄小懶

你可以把抓到的數(shù)據(jù)存儲到一個結(jié)構(gòu) struct
然后將這個 struct 存到一個全局的并發(fā)隊列 queue
關(guān)于這個隊列的使用詳見 ConcurrentQueue
最后開一個線程單獨監(jiān)視這個隊列 queue
當(dāng)發(fā)現(xiàn)其中有數(shù)據(jù)的時候往 sqlite 中寫入數(shù)據(jù)

2017年8月10日 04:08