これは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
のコードはそれ以降に実行されるため、データベースの更新は行われません。
フラットファイルチェッカーはRunChecksメソッドの戻り変数としてAutoResetEvent
しか受け入れないため、コードを変更できないためです。
** * ***ここは、私が今* ** * ** * プライベート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");
}
はまた、私は、検証に関するデータはその一部が実行されますので、少なくとも、イベントハンドラの最初の方に渡される部分を移動しました。これは役に立ちましたが、正しいかどうかはわかりません。
ここに欠けている部分があります。 do_checksイベントを作成していますが、後でRunChecks()が返すものを割り当てて、前に作成したものを上書きします。 RunValidationはAutoResetEventのみを受け付けますが、RunValidationはあなたのものであり、何も受け付けません。 RunChecksは1を返します。 RunChecksが返すものを待つことになっている可能性があります。 –
ありがとう!!! RunChecksがAutoResetイベントを返すのは間違いありません。だから私は様々な場所でこのAutoResetイベントを使用しています。異なる機能でどのように参照するのですか?だから私はそれを割り当てずに定義した後、RunChecksが返すときにそれを割り当てます。あなたはそれが正しいと思いますか? – MadCoder