我的代码有两种主要方法,将任务发送到远程(在另一个进程中)服务以执行,确认成功或失败。
每个任务都有很少的步骤,所以使用这个给定的任务(异步),方法AcknowledgeStepComplete 必须被多次调用。
public void AcknowledgeStepComplete(CollectionTask task)
{
...
}
public void AcknowledgeStepError(CollectionTask task, Exception exception)
{
...
}
public class CollectionTask : ICoordinationTask
{
public TimeSpan Timeout { get; set; }
}
当发送任务步骤执行时,我想知道在给定的时间范围内(即步骤超时)是否收到对这两种方法之一的任何调用。
如果不是 - 自己调用AcknowledgeStepError (否则 - 什么都不做)。
如何检查此条件,并仅在满足给定条件时调用?
感谢。
答案 0 :(得分:2)
也许将这种功能添加到CollectionTask就可以了 (语法不完美,但总体思路存在):
public class CollectionTask : ICoordinationTask
{
private Timer _taskInternalTimer;
public TimeSpan Timeout { get; set; }
public event TaskTimedOutEventHandler TaskTimedOut;
public CollectionTask ()
{
_taskInternalTimer = new Timer();
_taskInternalTimer.Elapsed += OnTaskInternalTimerElapsed;
_taskInternalTimer.Start();
}
private void OnTaskInternalTimerElapsed(object sender, ElapsedArgs args)
{
if (_taskInternalTimer.TotalMilisecond >= Timeout)
TaskTimedOut(this, new TaskTimedOutEventArgs());
}
}
并以这种方式使用:
在CollectionTask实例创建范围内
var task = new CollectionTask();
task.TaskTimedOut += OnTaskTimedOut
事件处理方法
private void OnTaskTimedOut(object sender, TaskTimedOutEventArgs args)
{
AcknowledgeStepError(args.Task, new Exception())
}
答案 1 :(得分:0)
我不确定我是否理解这个问题,但我会试一试..
根据我对问题的理解,CollectionTask有一些属性来定义任务的到期时间。
这样的事情:
public class CollectionTask
{
...
public DateTime TaskTimeout;
}
您可以定义每次输入AcknowledgeComplete时调用的委托
public void AcknowledgeComplete(CollectionTask task)
{
if (AcknowledgeCompleteStarted != null)
AcknowledgeCompleteStarted(this, new AcknowledgeCompleteStartedEventArgs(task))
....
....
}
这样当您输入方法时,您只需通知已注册到AcknowledgeCompleteStarted事件的某个对象,此事件发生,并且在已注册的方法中,您将能够运行您想要的任何逻辑,例如检查任务是否已达到超时,如果是,则以适当的异常激活AcknowledgeError。
通过这样做似乎可以简单得多:
public void AcknowledgeComplete(CollectionTask task)
{
if (task.Timeout < DateTime.Now)
AcknowledgeError(task, new Exception());
....
....
}
但我很确定这不是你在问题中得到的地方。 如果我没有达到问题的目标,请随意详细说明一些代码示例..
盖