Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.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中规定的时间后停止行执行#_C# - Fatal编程技术网

C# 在C中规定的时间后停止行执行#

C# 在C中规定的时间后停止行执行#,c#,C#,我有一个用C#开发的Windows服务,它以相等的时间间隔(比如30分钟)对数据进行计算。它从数据库中获取数据并调用一个方法CalcData(),该方法执行一些业务逻辑计算 class Program { static void Main(string[] args) { try { AutoCalExecution ae = new AutoCalExecution();

我有一个用C#开发的Windows服务,它以相等的时间间隔(比如30分钟)对数据进行计算。它从数据库中获取数据并调用一个方法CalcData(),该方法执行一些业务逻辑计算

class Program
    {
        static void Main(string[] args)
        {
            try
            {
                AutoCalExecution ae = new AutoCalExecution();
                ae.FetchData();
                ae.CalData();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);                
            }
            Console.ReadLine();
        }
 }

 class AutoCalExecution
{
    public void FetchData()
    {
        // fetch data from db
    }

    public void CalData()
    {
        line1;
        line2;
        line3;
        line4; // this line has som expression which actually does the calculation. 
        line5;
    }  
}
我已经给出了我正在使用的代码模板。在
CalData()
中,第4行是进行计算的位置。计算通常需要10分钟。因此,第4行执行10分钟

有些情况下,计算可能需要10分钟以上。在这种情况下,我想取消执行,并在一定时间后(比如15分钟)转到第5行

总而言之,我想为第4行设置15分钟的超时时间(可以根据需要进行配置),如果在15分钟内没有完成,它必须停止并到达第5行

 public void CalData()
    {
        line1;
        line2;
        line3;
        if ( set time to 15 mins exceeds){
            line4; // this line has some expression which actually does the calculation.    
        }
        else 
        {
            Log (Line4 execution did not complete in stipulated time);
        }
        line5;
    }
如何在C#中设置该条件

更新 这是我尝试过的:

var task = Task.Run(() => CalData());
                        if (task.Wait(TimeSpan.FromMinutes(Convert.ToDouble(timeout))))
                        {
                            if (task.Result)
                            {
                                log.Info("Completed");
                            }
                            else
                            {
                                log.Error("Not successful");                                
                            }
                        }

但这里的问题是,如果第4行没有完成,我希望在这个方法中执行第5行。有没有办法用一段代码/片段而不是整个方法来编写类似的代码?

我想你需要这样的东西:

var work = Task.Run(() => line4);
if (work.Wait(TimeSpan.FromMinutes(10)))
{
      // Work completed within the timeout
}
else
{
     // Work did not complete within the timeout
}
请注意,这实际上不会停止“DoWork”代码的运行,它将在工作线程上继续运行,直到完成为止。还请注意,如果使用不当,使用“等待”可能会导致死锁,请参阅

如果确实要取消处理,则应向DoWork提供cancellationToken,并在取消标记时使处理中止。还有一些解决方案可以中止正在运行的线程。

将第4行设置为任务

通过取消令牌使任务可取消

使用10分钟(配置时间)后自动取消的取消令牌


这是否回答了您的问题?您可以使用
任务
并设置
超时
。这可能会有帮助,因为没有内置的方法来终止语句,如果它花费的时间太长的话。不建议使用框架级别的方法终止此类操作。最好的答案是“不要扼杀行动,而是与之合作”。编写代码,以便在一段时间后可以中止,目前的典型做法是使用TaskCancellationToken。我已经更新了我所做的事情的答案。如何将单行变成任务?使用task。运行并传递取消标记。这就是我目前正在做的。我不希望将整个方法作为任务运行。我只希望方法的一行作为任务运行。然后运行整个块来代替“line4”,并用“line4”的代码替换“DoWork”。