0
在我的代碼中,有幾個策略需要保持一致。例如:用用戶反饋撰寫Polly政策
var myIOProblems = Policy
.Handle<IOException>()
.WaitAndRetryForever(i => TimeSpan.FromSeconds(2));
然後,我將有一些代碼,會做的工作:
myIOProblems
.Execute(() => otherPath.CopyTo(otherPathPart.FullName));
這個偉大的工程,我能產仔後聲明都在我的代碼,改變行爲一箇中心的地方,這似乎都有效。
但是在某些地方,我需要向用戶/框架提供一些有關問題正在發生的反饋。我可以寫一個新的策略:
Policy
.Handle<IOException>()
.WaitAndRetryForever(i => TimeSpan.FromSeconds(2), (e, t, c) =>
{
count++;
statusUpdate.PCall($"Copying {otherPath.Name}: {other.Name} -> {Name} (retry ({count}): {e.Message})");
})
.Execute(() => otherPath.CopyTo(otherPathPart.FullName));
但現在我已經失去了再利用的通用代碼的能力。我真的想寫的是類似於以下內容:
myIOProblems
.OnRetry(e => statusUpdate.PCall($"Error ({e.Message}), retrying"))
.Execute(() => otherPath.CopyTo(otherPathPart.FullName));
或類似的東西。我可能會忽視圖書館的某些東西,在這種情況下,我表示歉意!
建議使用'執行()'重載服用上下文數據。您可以使用相同的通用策略,但將不同的上下文數據提供給不同調用位置的'Execute()'。 'onRetry'委託接收這個'Context'作爲參數,並且可以相應地分配它的行爲。 –
上面的OnRetry是我編寫的 - 展示我想要做的事情。但是,是的,在上下文中,這將被提供給WaitAndRetryForever,也許我可以在那裏執行一個特殊的函子... – Gordon
我指的是內置於所有Polly重試策略中的onRetry委託,而不是你編寫了'.OnRetry()'。在你的第一個發佈的代碼示例中,代碼'(e,t,c)=> {...}'是'onRetry'委託。你在那裏的'c'輸入參數是'Context'。這個參數'c'會傳遞你傳遞給Execute()'重載的上下文數據的任何上下文數據。因此,您可以使用相同的通用策略,但通過在不同的調用位置將不同的上下文數據傳遞給Execute()來改變'onRetry'行爲。 –