你需要一个背景工作者。下面,在并行线程上调用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使用此私有集合,但不会发生冲突。