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

发布于 2022-09-06 23:53:22 字数 774 浏览 61 评论 0

情况是怎样的,我用多线程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存数据库?
    //需要用到线程池吗?
    //如何处理多线程的情况?
    //???
}

谢谢各位能给点意见?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

南街九尾狐 2022-09-13 23:53:22

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

云柯 2022-09-13 23:53:22
  1. 虽然你是多线程抓取数据,但是你操作sqlite的client是同一个,对于sqlite来说,只有一个连接,只是你在多线程里插入的时候,顺序是不能保证的,因为client是抢占式的
  2. 你可以把数据放到线程安全的数据集中,例如,ConcurrentQueue
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文