Это примерно 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
, код проверяется на Завершение проверки, и потому что это установлено по умолчанию в ложь, это возвращает ложь.Код в 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");
}
Также я переместил часть, где передаются данные о проверкек началу обработчика события, по крайней мере, эта часть будет выполнена.Это помогло, но я не уверен, правильно ли это.