1

我的代码有两个主要方法,它们将任务发送到远程(在另一个进程中)服务执行,并确认成功或失败

每个任务都有几个步骤,因此必须使用此给定任务(异步)多次调用AcknowledgeStepComplete 方法。

public void AcknowledgeStepComplete(CollectionTask task)
{
...
}


public void AcknowledgeStepError(CollectionTask task, Exception exception)
{
...
}

public class CollectionTask : ICoordinationTask
{
    public TimeSpan Timeout { get; set; }
}

在发送任务步骤以执行时,我想知道在给定的时间范围内(即步骤超时)是否收到了对这两种方法之一的调用。

如果不是- 自己调用 AcknowledgeStepError(否则 - 什么也不做)。

我如何检查这个条件,只有在满足给定条件时才调用?

谢谢。

4

2 回答 2

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())
 }
于 2013-09-02T07:14:02.450 回答
1

我不确定我是否完全理解了这个问题,但我会试一试..

根据我对 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());
    ....
    ....
}

但我很确定这不是你的问题所在。如果我没有达到问题的目标,请随时使用更多代码示例进行详细说明..

盖伊

于 2013-09-01T21:35:00.733 回答