远程服务异步调用的交叉方法超时

时间:2013-09-01 13:29:24

标签: c# wcf

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

每个任务都有很少的步骤,所以使用这个给定的任务(异步),方法AcknowledgeStepComplete 必须被多次调用

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


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

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

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

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

如何检查此条件,并仅在满足给定条件时调用?

感谢。

2 个答案:

答案 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());
    ....
    ....
}

但我很确定这不是你在问题中得到的地方。 如果我没有达到问题的目标,请随意详细说明一些代码示例..