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

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

情況是怎樣的,我用多線程Task去抓取數(shù)據(jù),抓到數(shù)據(jù)后該如何存數(shù)據(jù)庫(kù)?數(shù)據(jù)庫(kù)是sqlite。
1、開(kāi)始我想直接在task里存數(shù)據(jù)庫(kù),但是在多線程的情況下,就會(huì)出現(xiàn)多個(gè)線程同時(shí)操作一個(gè)數(shù)據(jù)庫(kù)文件,不知道會(huì)不會(huì)沖突,數(shù)據(jù)庫(kù)能承受的最大連接數(shù)是多少?
2、后來(lái)我想單獨(dú)開(kāi)個(gè)線程只存數(shù)據(jù)庫(kù),所有Task里的數(shù)據(jù)都交給這個(gè)數(shù)據(jù)庫(kù)線程。可是我不知道怎么實(shí)現(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,這里沒(méi)有寫代碼
    this.BeginInvoke(updateUI, i);
    //如何把list存數(shù)據(jù)庫(kù)?
    //需要用到線程池嗎?
    //如何處理多線程的情況?
    //???
}

謝謝各位能給點(diǎn)意見(jiàn)?

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

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

2017年8月10日 04:08