winform多线程抓取数据如何更新数据库?

情况是怎样的,我用多线程Task去抓取数据,抓到数据后该如何存数据库?数据库是sqlite。
1、开始我想直接在task里存数据库,但是在多线程的情况下,就会出现多个线程同时操作一个数据库文件,不知道会不会冲突,数据库能承受的最大连接数是多少?
2、后来我想单独开个线程只存数据库,所有Task里的数据都交给这个数据库线程。可是我不知道怎么实现。

下面是伪代码

//主线程
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>();  //抓取到的数据信息
    //模拟抓取数据
    Thread.Sleep(1000);
    list.Add("A"+i);
    list.Add("B"+i);
    list.Add("C"+i);
    //委托更新ui,这里没有写代码
    this.BeginInvoke(updateUI, i);
    //如何把list存数据库?
    //需要用到线程池吗?
    //如何处理多线程的情况?
    //???
}

谢谢各位能给点意见?

阅读 3.9k
2 个回答

你可以把抓到的数据存储到一个结构 struct
然后将这个 struct 存到一个全局的并发队列 queue
关于这个队列的使用详见 ConcurrentQueue
最后开一个线程单独监视这个队列 queue
当发现其中有数据的时候往 sqlite 中写入数据

  1. 虽然你是多线程抓取数据,但是你操作sqlite的client是同一个,对于sqlite来说,只有一个连接,只是你在多线程里插入的时候,顺序是不能保证的,因为client是抢占式的
  2. 你可以把数据放到线程安全的数据集中,例如,ConcurrentQueue
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进