这是关于AutoResetEvent
C# 中的。我试图阅读其他答案,但我无法理解并适用于我的场景。我没有写任何线程应用程序。只是一个小应用程序来读取/验证文件和更新。所以我有这个要求写一些代码来读取一个固定长度的文件,验证它,然后如果它是有效的,将它上传到数据库。
我得到了一切工作,直到我被困在AutoResetEvent
. 这就是正在发生的事情。解析/读取数据后,我使用 C# 中的平面文件检查器实用程序对其进行验证。所以我将这些函数调用到我的应用程序中。这是片段。
private AutoResetEvent do_checks = new AutoResetEvent(false);
public bool ValidationComplete = false;
这部分进入初始化代码:
this._files.Validated += new EventHandler<SchemaValidatedEventArgs>(FileSetValidated);
public bool ValidateFile()
{
try
{
RunValidation();
return true;
}
catch (Exception e)
{
log.Error("Data Validation failed because :" + e.Message);
return false;
}
}
private void RunValidation()
{
// Use Flat File Checker user interface to create Schema file.
do_checks = _files.RunChecks();
log.Debug("Validation Started");
}
这是在验证过程中被异步调用的方法:
public void FileSetValidated(Object sender, SchemaValidatedEventArgs e)
{
try
{
ValidationComplete = e.Result;
if (IsDataValid)
{
log.Debug("Data is validated and found to be valid.");
}
else
{
log.Debug("Data is validated and found to be Invalid");
}
}
finally
{
do_checks.Set();
}
}
发生的情况是,即使在我将任何值设置到ValidationComplete
代码中之前,也会检查验证是否完成,并且因为它默认设置为 false,所以它返回 false。之后执行代码中的代码FileSetValidated
,因此数据库更新永远不会发生。
原因是我无法更改代码,因为平面文件检查器只接受一个AutoResetEvent
作为 RunChecks 方法中的返回变量。
** * ***这是我现在所做的* ** * ** * private AutoResetEvent do_checks;
public bool ValidateFile()
{
try
{
string extFilePath = surveyFile.ExtFilePath;
File.Copy(extFilePath, localTempFolder + "ExtractFile.Dat");
RunValidation();
if (!do_checks.WaitOne(TimeSpan.FromSeconds(30))) {
// throw new ApplicationException("Validation took more than expected!");
}
return true;
}
catch (Exception e)
{
log.Error("Data Validation failed because :" + e.Message);
return false;
}
}
private void RunValidation()
{
// Use Flat File Checker user interface to create Schema file.
do_checks = _files.RunChecks();
do_checks.WaitOne();
log.Debug("Validation Started");
}
此外,我将传递有关验证的数据的部分移到事件处理程序的开头,以便至少执行该部分。这有帮助,但我不确定它是否正确。