Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 远程服务异步调用的跨方法超时_C#_Wcf - Fatal编程技术网

C# 远程服务异步调用的跨方法超时

C# 远程服务异步调用的跨方法超时,c#,wcf,C#,Wcf,我的代码有两种主要方法,将任务发送到远程(在另一个进程中)服务以执行,以及确认成功或失败 每个任务都有几个步骤,因此必须对该给定任务多次调用方法AcknowledgesTechComplete(异步) 在发送任务步骤执行时,我想知道在给定的时间范围内(即步骤超时),是否收到了对这两个方法之一的调用 如果不是-调用确认消息或我自己 (否则-什么也不做) 如何检查此条件,并仅在满足给定条件时调用 谢谢。我不确定我是否完全理解了这个问题,但我会试一试 根据我对问题CollectionTask的理解,它

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

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

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

如果不是-调用确认消息或我自己 (否则-什么也不做)

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


谢谢。

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

根据我对问题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())
 }