代码之家  ›  专栏  ›  技术社区  ›  Łukasz Sowa

使用另一线程中搜索运行的部分结果更新列表

  •  1
  • Łukasz Sowa  · 技术社区  · 17 年前

    我有一个带有listview(resultslist)的wpf表单,我有一个静态方法获取器,它通过分页返回搜索网页上某些信息的结果(一次搜索所有页面,或为每个页面返回一个)。它是使用WebClient完成的,因此获取40个站点需要大约2分钟。我不想在搜索完成后立即显示结果,但我希望它们在收集结果时显示在结果列表上,因此按部分显示,这样,如果发现有用的内容,用户就可以停止搜索。这就像是在Windows中搜索——搜索结果会随着发现的东西而不断出现,而不是同时出现。

    我认为这在多线程应用程序中是很常见的问题,我无法克服。

    1 回复  |  直到 17 年前
        1
  •  2
  •   Sergey Aldoukhov    17 年前

    你需要一个背景工作者。下面,在并行线程上调用loadchunk过程,但在主线程上调用chunkloaded,因此您将结果累积到loadchunk中的临时列表中,但是当您在工作线程上调用reportprogress时,可以从临时列表中填充主UI绑定集合。

        public void LoadDataAsync()
        {
            ...
            BackgroundWorker bw = new BackgroundWorker();
            bw.WorkerReportsProgress = true;
            bw.DoWork += LoadChunk;
            bw.ProgressChanged += new ProgressChangedEventHandler(ChunkLoaded);
            bw.RunWorkerAsync();
        }
    
        void ChunkLoaded(object sender, ProgressChangedEventArgs e)
        {
           PopulateDataToUI();
        }
    
        private void LoadChunk(object sender, DoWorkEventArgs e)
        {
            int chunkNum = 0;
            BackgroundWorker bw = (BackgroundWorker)sender;
            bw.ReportProgress(chunkNum++);
            while (true)
            {
               ...   
               bw.ReportProgress(chunkNum++);
               if (done) then break;
            }
        }
    

    编辑:我不锁定任何东西-loadchunk读取到一个私有集合,并将私有集合的传输分块加载到一个可观察的集合。虽然只有一个BackgroundWorker使用此私有集合,但不会发生冲突。