【发布时间】:2014-06-24 13:56:35
【问题描述】:
我有一个这样的文件数组..
字符串[] 解压缩文件; 这个想法是我想并行解析这些文件。当它们被解析时,一条记录被放置在一个并发包上。随着记录的放置,我想启动更新功能。
这是我在 Main() 中所做的:
foreach(var file in unZippedFiles)
{ Parallel.Invoke
(
() => ImportFiles(file),
() => UpdateTest()
);
}
Update 的代码是这样的。
static void UpdateTest( )
{
Console.WriteLine("Updating/Inserting merchant information.");
while (!merchCollection.IsEmpty || producingRecords )
{
merchant x;
if (merchCollection.TryTake(out x))
{
UPDATE_MERCHANT(x.m_id, x.mInfo, x.month, x.year);
}
}
}
这就是导入代码的样子。它几乎是一个巨大的字符串解析器。
System.IO.StreamReader SR = new System.IO.StreamReader(fileName);
long COUNTER = 0;
StringBuilder contents = new StringBuilder( );
string M_ID = "";
string BOF_DELIMITER = "%%MS_SKEY_0000_000_PDF:";
string EOF_DELIMITER = "%%EOF";
try
{
record_count = 0;
producingRecords = true;
for (COUNTER = 0; COUNTER <= SR.BaseStream.Length - 1; COUNTER++)
{
if (SR.EndOfStream)
{
break;
}
contents.AppendLine(Strings.Trim(SR.ReadLine()));
contents.AppendLine(System.Environment.NewLine);
//contents += Strings.Trim(SR.ReadLine());
//contents += Strings.Chr(10);
if (contents.ToString().IndexOf((EOF_DELIMITER)) > -1)
{
if (contents.ToString().StartsWith(BOF_DELIMITER) & contents.ToString().IndexOf(EOF_DELIMITER) > -1)
{
string data = contents.ToString();
M_ID = data.Substring(data.IndexOf("_M") + 2, data.Substring(data.IndexOf("_M") + 2).IndexOf("_"));
Console.WriteLine("Merchant: " + M_ID);
merchant newmerch;
newmerch.m_id = M_ID;
newmerch.mInfo = data.Substring(0, (data.IndexOf(EOF_DELIMITER) + 5));
newmerch.month = DateTime.Now.AddMonths(-1).Month;
newmerch.year = DateTime.Now.AddMonths(-1).Year;
//Update(newmerch);
merchCollection.Add(newmerch);
}
contents.Clear();
//GC.Collect();
}
}
SR.Close();
// UpdateTest();
}
catch (Exception ex)
{
producingRecords = false;
}
finally
{
producingRecords = false;
}
}
我遇到的问题是更新运行一次,然后 importfile 函数只是接管并且不屈服于更新函数。关于我做错了什么的任何想法都会有很大帮助。
【问题讨论】:
-
看起来是时间问题。您的
UpdateTest在ImportFiles有机会将项目放入metchCollection或将producingRecords设置为true 之前完成。在没有看到其余代码的情况下,这是在黑暗中的狂野刺痛。 -
我同意这是一个时间问题。但我想我要问的是为什么 ImportFile 不产生。我也会添加导入代码。
-
以下是您可以修补它的方法:将
merchCollection声明为BlockingCollection<merchant>在foreach范围内;完全抛弃producingRecords变量——它不适合线程同步;更改您的更新以通过foreach (var m in merchCollection.GetConsumingEnumerable())遍历阻塞集合;在您的ImportFilesfinally块中调用merchCollection.CompleteAdding(),从而完成您的更新。瞧!
标签: c#-4.0 task-parallel-library parallel.foreach