Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在采取任何其他操作之前等待自动重置事件发生?_C#_Multithreading_Autoresetevent - Fatal编程技术网

C# 如何在采取任何其他操作之前等待自动重置事件发生?

C# 如何在采取任何其他操作之前等待自动重置事件发生?,c#,multithreading,autoresetevent,C#,Multithreading,Autoresetevent,这是关于C#中的AutoResetEvent。我试图阅读其他答案,但我无法理解并应用于我的情景。我没有写任何线程应用程序。只是一个用于读取/验证文件和更新的小应用程序。 所以我需要编写一些代码来读取固定长度的文件,验证它,然后将它上传到数据库 我一直在工作,直到我被AutoResetEvent卡住。下面是正在发生的事情。一旦数据被解析/读取,我就使用C#中的平面文件检查器工具对其进行验证。因此,我将这些函数调用到我的应用程序中。下面是片段 private AutoResetEvent do_ch

这是关于C#中的
AutoResetEvent
。我试图阅读其他答案,但我无法理解并应用于我的情景。我没有写任何线程应用程序。只是一个用于读取/验证文件和更新的小应用程序。 所以我需要编写一些代码来读取固定长度的文件,验证它,然后将它上传到数据库

我一直在工作,直到我被
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");
}
发生的情况是,即使在我将任何值设置到
ValidationComplete
之前,代码也会被检查是否已完成验证,因为它在默认情况下设置为false,所以返回false。
FileSetValidated
中的代码在此之后执行,因此数据库更新永远不会发生

原因是我无法更改代码,因为平面文件检查器只接受
AutoResetEvent
作为RunChecks方法中的返回变量

******以下是我现在所做的****** 私人AutoResetEvent do_检查

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");


    }

我还将传递验证数据的部分移到事件处理程序的开头,以便至少执行该部分。这有帮助,但我不确定它是否正确。

在退出ValidateFile函数之前,您需要等待验证完成(等待AutoResetEvent)并返回验证结果

试着这样做:

public bool ValidateFile()
{
    //try
    {
        RunValidation();

        //Allocate enough time for the validation to occur but make sure 
        // the application doesn't block if the _files.Validated event doesn't get fired
        if(!do_checks.WaitOne(TimeSpan.FromSeconds(10)))
        {
            throw ApplicationException("Validation took more than expected!");
        }            

        return ValidationComplete;
    }
    //I would not catch the exception since having an error doesn't mean that the file 
    //is invalid. Catch it upper in the call stack and inform the user that the validation 
    //could not be performed because of the error
    //catch (Exception e)
    //{
    //     log.Error("Data Validation failed because :" + e.Message);
    //     return false;
    //}
 }

在退出ValidateFile函数之前,您需要等待验证完成(等待AutoResetEvent)并返回验证结果

试着这样做:

public bool ValidateFile()
{
    //try
    {
        RunValidation();

        //Allocate enough time for the validation to occur but make sure 
        // the application doesn't block if the _files.Validated event doesn't get fired
        if(!do_checks.WaitOne(TimeSpan.FromSeconds(10)))
        {
            throw ApplicationException("Validation took more than expected!");
        }            

        return ValidationComplete;
    }
    //I would not catch the exception since having an error doesn't mean that the file 
    //is invalid. Catch it upper in the call stack and inform the user that the validation 
    //could not be performed because of the error
    //catch (Exception e)
    //{
    //     log.Error("Data Validation failed because :" + e.Message);
    //     return false;
    //}
 }

我从未使用过这个库,所以我只是下载了它并查看了代码

首先,正如前面提到的“500-内部服务器错误”,似乎缺少部分代码,至少在FileSetValidated方法中是“try”。我看不到您通过WaitOne等待活动的任何地方

您不需要自己创建do_checks,因为\u files.RunChecks()会为该特定文件的处理创建自动恢复。因此,如果您对该事件使用相同的字段,那么如果您需要同时处理几个文件,就会出现问题。因此,对于每个文件保持单独的事件,在任何情况下,如果您不想停止中间的处理(如果您将调用<强> DOSCHECK(SET))<强>在处理过程中,它将取消处理而不结束它,那么我不认为保持引用为成员。 正如我在lib代码中看到的,您不应该在FileSetValidated方法中调用do\u checks.Set(),因为一旦处理完成,它就会被设置,所以您可以只写:

var do_checks = _files.RunChecks();
do_checks.WaitOne(); 
如果有帮助的话,请随意分享

更新: 我现在无法检查lib,以了解在开始处理后设置do\u checks的原因,但我可以建议您将初始代码与下一个RunValidation方法一起使用:

private void RunValidation()
{
    do_checks.Reset(); //reset state
    _files.RunChecks(); //don't store event from the lib
    log.Debug("Validation Started");
    do_checks.WaitOne(); //Wait for FileSetValidated to set this event
}

我从未使用过这个库,所以我只是下载了它并查看了代码

首先,正如前面提到的“500-内部服务器错误”,似乎缺少部分代码,至少在FileSetValidated方法中是“try”。我看不到您通过WaitOne等待活动的任何地方

您不需要自己创建do_checks,因为\u files.RunChecks()会为该特定文件的处理创建自动恢复。因此,如果您对该事件使用相同的字段,那么如果您需要同时处理几个文件,就会出现问题。因此,对于每个文件保持单独的事件,在任何情况下,如果您不想停止中间的处理(如果您将调用<强> DOSCHECK(SET))<强>在处理过程中,它将取消处理而不结束它,那么我不认为保持引用为成员。 正如我在lib代码中看到的,您不应该在FileSetValidated方法中调用do\u checks.Set(),因为一旦处理完成,它就会被设置,所以您可以只写:

var do_checks = _files.RunChecks();
do_checks.WaitOne(); 
如果有帮助的话,请随意分享

更新: 我现在无法检查lib,以了解在开始处理后设置do\u checks的原因,但我可以建议您将初始代码与下一个RunValidation方法一起使用:

private void RunValidation()
{
    do_checks.Reset(); //reset state
    _files.RunChecks(); //don't store event from the lib
    log.Debug("Validation Started");
    do_checks.WaitOne(); //Wait for FileSetValidated to set this event
}

这里少了一些碎片。您正在创建do_checks事件,但随后会指定RunChecks()返回的内容,从而覆盖先前创建的内容。您在上面说过RunValidation只接受AutoResetEvent,但RunValidation是您的,不接受任何东西。RunChecks返回一个。您可能需要等待运行检查返回的内容。谢谢!!!运行检查返回自动重置事件是正确的。所以我在不同的地方使用这个自动重置事件。如何在不同的函数中引用它?所以我只是定义了它而没有赋值,后来当RunChecks返回时,我就赋值了它。你认为对吗?这里少了一些碎片。您正在创建do_checks事件,但随后会指定RunChecks()返回的内容,从而覆盖先前创建的内容。您在上面说过RunValidation只接受AutoResetEvent,但RunValidation是您的,不接受任何东西。RunChecks返回一个。您可能需要等待运行检查返回的内容。谢谢!!!运行检查返回自动重置事件是正确的。所以我在不同的地方使用这个自动重置事件。我如何在不同的语言中引用它