暂停循环直到内部函数返回(C#)

时间:2011-10-04 15:51:16

标签: c# for-loop dataset

我有一个循环,在LoadAmazonDataByBatch()返回之前我不想继续。我知道必须有一种直截了当的做法,我几乎可以肯定我正在接近这个问题。

const int batchSize = 500;
for (int i = 0; i < total; i = i + batchSize)
{
    LoadAmazonDataByBatch(i, batchSize, fileList, total, amazonLogHandler, stopWatch);
}

LoadAmazonDataByBatch()在工作线程上做了很多事情,包括创建一个临时的DataSet,它会在没有批处理的情况下变得非常大。在处理和处理旧数据集之前,我不想创建新的DataSet(通过LoadAmazonDataByBatch)。 显然,现在写的方式几乎都是一次性的。

我怎样才能更好地接近这个?

5 个答案:

答案 0 :(得分:2)

您需要进行某种线程同步。

不清楚LoadAmazonByBatch()的位置,但我建议

  • 检查该函数的doc以查看是否存在该操作的同步版本。

  • 如果没有可用的文档,那么你需要卷起袖子。可能需要查看或修改LoadAmazonByBatch()的来源。查找工作人员完成时设置的ManualResetEvent。或者,也许在该方法完成时会发生一个常规的.NET事件。如果那些东西不存在,你需要添加类似的东西。

答案 1 :(得分:0)

LoadAmazonDataByBatch很可能会创建一堆线程。你必须在所有创建的线程上调用Join来等待它们完成。

答案 2 :(得分:0)

这个不会等待函数返回的唯一方法是它是否异步写入?

相关代码不是您发布的循环,而是我们需要查看的LoadAmazonDataByBatch()定义。

答案 3 :(得分:0)

如果该函数有回调(stopWatch?),也许你可以在回调中调用函数(LoadAmazonDataByBatch)。

答案 4 :(得分:0)

如果LoadAmazonDataByBatch()生成子线程,并且它运行直到每个线程都完成,您可以使用Thread.Join()方法使其等待子线程完成。我不确定这对多个孩子有什么用,但我认为应该没问题。

参考:Threading in C#