這是關於C#中的AutoResetEvent
。我試圖閱讀其他答案,但我無法理解並適用於我的場景。我不寫任何線程應用程序。只是一個小的應用程序來讀取/驗證文件和更新。 所以我有這個需求來編寫一些代碼來讀取一個固定長度的文件,驗證它,然後如果它是有效的上傳到數據庫。如何在採取任何其他操作之前等待Autoreset事件發生?
我得到了一切工作,直到我被困在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");
}
這是得到驗證過程中asnchronusly調用的方法:
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方法中的返回變量。
** * ***這是我現在* ** * ** * 私人的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");
}
而且我搬到哪裏有關驗證數據被傳遞對事件處理程序的開頭,以便ATLEAST一部分被執行的部分。這有幫助,但我不確定它是否正確。
這裏有一些作品缺失。您正在創建do_checks事件,但稍後會分配RunChecks()返回的內容,從而覆蓋您之前創建的內容。你上面說過,RunValidation只接受一個AutoResetEvent,但RunValidation是你的,不接受任何東西。 RunChecks返回一個。您可能需要等待RunChecks返回的內容。 –
謝謝!!! RunChecks正在返回AutoReset事件是正確的。所以我在不同的地方使用這個AutoReset事件。我如何在不同的功能中引用它?所以我只是定義它,沒有分配,後來當RunChecks返回我分配它。你認爲那是正確的嗎? – MadCoder