C# 远程服务异步调用的跨方法超时
我的代码有两种主要方法,将任务发送到远程(在另一个进程中)服务以执行,以及确认成功或失败 每个任务都有几个步骤,因此必须对该给定任务多次调用方法AcknowledgesTechComplete(异步) 在发送任务步骤执行时,我想知道在给定的时间范围内(即步骤超时),是否收到了对这两个方法之一的调用 如果不是-调用确认消息或我自己 (否则-什么也不做) 如何检查此条件,并仅在满足给定条件时调用C# 远程服务异步调用的跨方法超时,c#,wcf,C#,Wcf,我的代码有两种主要方法,将任务发送到远程(在另一个进程中)服务以执行,以及确认成功或失败 每个任务都有几个步骤,因此必须对该给定任务多次调用方法AcknowledgesTechComplete(异步) 在发送任务步骤执行时,我想知道在给定的时间范围内(即步骤超时),是否收到了对这两个方法之一的调用 如果不是-调用确认消息或我自己 (否则-什么也不做) 如何检查此条件,并仅在满足给定条件时调用 谢谢。我不确定我是否完全理解了这个问题,但我会试一试 根据我对问题CollectionTask的理解,它
谢谢。我不确定我是否完全理解了这个问题,但我会试一试 根据我对问题CollectionTask的理解,它有一些属性定义了任务的过期时间 大概是这样的:
public class CollectionTask
{
...
public DateTime TaskTimeout;
}
您可以定义每次输入AcknowledgeComplete时将调用的委托
public void AcknowledgeComplete(CollectionTask task)
{
if (AcknowledgeCompleteStarted != null)
AcknowledgeCompleteStarted(this, new AcknowledgeCompleteStartedEventArgs(task))
....
....
}
这样,当您输入方法时,您只需通知已注册到AcknowledgeCompleteTestarted event的某个对象该事件已发生,并且在已注册的方法中,您将能够运行所需的任何逻辑,例如,检查任务是否已达到超时,如果已达到超时,则使用适当的异常激活AcknowledgeError
似乎只要做到以下几点就可以简单得多:
public void AcknowledgeComplete(CollectionTask task)
{
if (task.Timeout < DateTime.Now)
AcknowledgeError(task, new Exception());
....
....
}
公共作废确认完成(CollectionTask任务)
{
if(task.Timeout
但我很确定你的问题不是这样的。
如果我没有达到问题的目标,请随意用更多的代码示例进行详细说明
盖伊也许将这种功能添加到CollectionTask中就可以了 (语法并不完美,但总的想法是存在的): 并以这种方式使用它: 在CollectionTask实例创建的范围内 事件句柄方法
您好,Yossi,您能为远程服务添加执行异步调用的示例代码吗?超时必须为TimeSpan。。至于你的建议,它和我想要的很接近。除了一件(主要的)事情——如果AcknowledgeComplete根本没有收到呼叫,我们仍然应该调用AcknowledgeError
public void AcknowledgeComplete(CollectionTask task)
{
if (task.Timeout < DateTime.Now)
AcknowledgeError(task, new Exception());
....
....
}
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());
}
}
var task = new CollectionTask();
task.TaskTimedOut += OnTaskTimedOut
private void OnTaskTimedOut(object sender, TaskTimedOutEventArgs args)
{
AcknowledgeStepError(args.Task, new Exception())
}