2013-09-01 66 views
1

我的代碼有執行該發送任務到遠程(另一個進程)兩種主要方法服務,以及確認成功或失敗跨方法超時遠程服務異步調用

每個任務都有幾個步驟,所以它必須使用此給定任務(異步)多次調用方法AcknowledgeStepComplete

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


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

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

當發送用於執行的任務步驟,我想知道如果這兩種方法中的一個的任何呼叫被接收時,一個給定的時間幀(即步驟超時)內。

如果不是 - 自己調用AcknowledgeStepError (否則 - 什麼都不做)。

我該如何檢查這個條件,並且只有在滿足給定的條件時才能調用?

謝謝。

+0

貝納嗨,你能不能請加asyncrounous調用執行的示例代碼遠程服務? –

回答

2

也許添加此fucnionality到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()) 
} 
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()); 
    .... 
    .... 
} 

,但我敢肯定,這不是你在哪裏,在你的問題中獲得。 如果我沒有達到這個問題的目標,請隨意詳細說明一些代碼示例。

蓋伊

+0

Timeout必須是TimeSpan ..至於你的建議,它接近我所尋找的。除了一個(主要)事件 - 如果AcknowledgeComplete根本沒有收到任何呼叫,我們仍然應該調用AcknowledgeError –