Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
暂停循环直到内部函数返回(C#)_C#_For Loop_Dataset - Fatal编程技术网

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

暂停循环直到内部函数返回(C#),c#,for-loop,dataset,C#,For Loop,Dataset,我有一个循环,在loadamazondabybatch()返回之前我不想继续。我知道必须有一个直截了当的方法来做,我几乎可以肯定我处理问题的方法是错误的 const int batchSize=500; 对于(int i=0;i{…来做一些工作。然后您需要Task.Wait()或Task.WaitAll()。你是对的,但这更多的是一个评论而不是一个答案。感谢你的回答。我实现了LoadAmazonByBatch(),它在每次调用中使用一个任务.Factory.StartNew(()=>)来完成它的

我有一个循环,在
loadamazondabybatch()
返回之前我不想继续。我知道必须有一个直截了当的方法来做,我几乎可以肯定我处理问题的方法是错误的

const int batchSize=500;
对于(int i=0;i
loadamazondabybatch()
在工作线程上执行一系列操作,包括创建一个临时数据集,该数据集在没有批处理的情况下会变得非常大。我不想创建一个新的数据集,直到旧的数据集被处理和处置(通过LoadAmazonDataByBatch)。 很明显,按照现在的写法,一切几乎同时发生


如何才能更好地实现这一点?

LoadAmazonDataByBatch很可能会创建一组线程。您必须对所有创建的线程调用Join以等待它们完成。

当然,不等待函数返回的唯一方法是异步写入函数


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

您需要执行某种线程同步

不清楚您从哪里获得的
LoadAmazonByBatch()
,但我建议

  • 检查该函数的文档,查看是否存在该操作的同步版本

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


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

如果
LoadAmazonDataByBatch()
生成子线程,并一直运行到每个线程完成,则可以使用
Thread.Join()
方法使其等待子线程完成。我不确定这对多个孩子会起什么作用,但我认为应该可以


参考:

如果实现使用QueueUserWorkItem(),则可能不可能,因为它应该这样做。每个LoadAmazon调用都使用
Task.Factory.StartNew(()=>{…
来做一些工作。然后您需要
Task.Wait()
Task.WaitAll()
。你是对的,但这更多的是一个评论而不是一个答案。感谢你的回答。我实现了
LoadAmazonByBatch()
,它在每次调用中使用一个
任务.Factory.StartNew(()=>
)来完成它的工作(从文件读取,然后保存到数据集,然后加载到SQL).ok,那么您需要决定是否需要异步行为。Task.Factory允许您在后台运行,但现在您说您不需要。我怀疑在fn中异步加载有一些好处(特别是异步http请求),因此我建议添加线程同步功能。根据方法参数,可以选择在
LoadAmazonByBatch()
中执行
Task.WaitAll()
。我将对此进行一次尝试。我在后台执行此工作以避免挂起UI线程。好的,可以,但是..执行
任务。等待()
将…啊…等待…后台工作完成。如果您正在执行
任务。等待()
在UI线程上,UI线程将挂起。因此,您需要更仔细地考虑您正试图完成的任务。似乎您希望运行循环的东西不在UI线程上。这本身应该由
Task.StartNew()
启动。然后,循环在bg线程中运行。放置
Task.WaitAll()
LoadAmazonByBatch()
中,您一次只能获得一个大数据集。是的,您是对的。我所做的是从
LoadAmazonData()
中删除背景线程创建,并使用新线程
Task.Factory.StartNew()=>
。工作正常,函数不再独立运行。感谢您的帮助。
LoadAmazonDataByBatch
看起来像什么?您可以更改该方法吗?它是否有回调?如果该方法无法让您知道何时完成,则可能无法执行。