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