Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Důležité
Support pro model v procesu skončí 10. listopadu 2026. Důrazně doporučujeme migrovat aplikace do izolovaného modelu pracovních procesů pro plnou podporu.
Durable Functions poskytuje trvanlivé časovače pro použití ve funkcích orchestrátoru, aby implementovaly prodlevy nebo nastavily časové limity u asynchronních akcí. Používejte trvalé časovače ve funkcích orchestrátoru sleep místo rozhraní API, delay která mohou být součástí jazyka.
Odolné sady SDK úloh poskytují trvalé časovače pro použití v orchestracích k implementaci zpoždění nebo nastavení časových limitů u asynchronních akcí. Používejte trvalé časovače v orchestracích místo rozhraní API, jako jsou sleep nebo delay, která můžou být součástí jazyka.
Důležité
V současné době není sada POWERShell Durable Task SDK dostupná.
Trvalé časovače jsou úlohy vytvořené pomocí příslušného create timer rozhraní API pro zadaný jazyk, jak je znázorněno v následujících příkladech, a jako argument přijímají buď konkrétní časový okamžik, nebo dobu trvání.
// Put the orchestrator to sleep for 72 hours
DateTime dueTime = context.CurrentUtcDateTime.AddHours(72);
await context.CreateTimer(dueTime, CancellationToken.None);
// Put the orchestration to sleep for 72 hours
await context.CreateTimer(TimeSpan.FromHours(72), CancellationToken.None);
Když await spustíte úlohu časovače, funkce orchestrátoru přejde do režimu spánku až do zadané doby vypršení platnosti.
Když await úlohu časovače, orchestrace se pozastaví do zadaného času vypršení platnosti.
Poznámka:
Orchestrace nadále zpracovávají další příchozí události při čekání na vypršení platnosti úlohy časovače.
Omezení trvalých časovačů
Když vytvoříte časovač, jehož platnost vyprší v 18:30 UTC, podkladová architektura úloh Durable Task Framework vytvoří zprávu, která se zobrazí pouze v 14:30 UTC. Pokud se mezitím aplikace funkcí škáluje na nulu instancí, nově viditelná zpráva časovače zajistí, že se aplikace funkcí znovu aktivuje na příslušném virtuálním počítači.
Poznámka:
- Pro javascriptové, Python a aplikace PowerShellu jsou trvalé časovače omezené na šest dnů. Pokud chcete toto omezení obejít, použijte rozhraní API časovače ve
whilesmyčce k simulaci delšího zpoždění. Aktuální .NET a Java aplikace podporují libovolně dlouhé časovače. - V závislosti na používané verzi sady SDK a poskytovatele úložiště můžou být dlouhé časovače šesti dnů nebo více interně implementovány pomocí řady kratších časovačů (například třídenní doby trvání), dokud nedosáhne požadované doby vypršení platnosti. Toto chování je pozorovatelné v podkladovém úložišti dat, ale nemá vliv na chování orchestrace.
- K získání aktuálního času nepoužívejte integrovaná rozhraní API pro datum a čas. Při výpočtu budoucího data vypršení platnosti časovače vždy použijte aktuální rozhraní API funkce orchestratoru. Další informace najdete v článku omezení kódu funkce orchestrátoru.
Když vytvoříte časovač, jehož platnost vyprší v 18:30 UTC, podkladová architektura úloh Durable Task Framework vytvoří zprávu, která se zobrazí pouze v 14:30 UTC. Zpráva časovače zajistí, že se pracovní proces znovu aktivuje, jakmile vyprší platnost časovače.
Poznámka:
- Zadání dlouhého zpoždění (například zpoždění několika dnů nebo více) může vést k vytvoření několika interně spravovaných trvalých časovačů. Kód orchestrace nemusí o tomto chování vědět. Může se však zobrazit v protokolech rámce a ve stavu uložené historie.
- K získání aktuálního času nepoužívejte předdefinovaná rozhraní API pro datum a čas. Při výpočtu budoucího data vypršení platnosti časovače vždy použijte vlastnost aktuálního času kontextu orchestrace (například
context.CurrentUtcDateTimev .NET,ctx.current_utc_datetimev Python neboctx.currentUtcDateTimev JavaScriptu).
Použití trvalých časovačů pro zpoždění
Následující příklad ukazuje, jak použít trvalé časovače ke zpoždění provádění. Příklad vydává oznámení o fakturaci každý den po dobu 10 dnů.
[FunctionName("BillingIssuer")]
public static async Task Run(
[OrchestrationTrigger] IDurableOrchestrationContext context)
{
for (int i = 0; i < 10; i++)
{
DateTime deadline = context.CurrentUtcDateTime.Add(TimeSpan.FromDays(1));
await context.CreateTimer(deadline, CancellationToken.None);
await context.CallActivityAsync("SendBillingEvent");
}
}
Poznámka:
Předchozí příklad jazyka C# cílí na Durable Functions 2.x. Pro Durable Functions 1.x místo DurableOrchestrationContext použijte IDurableOrchestrationContext. Další informace o rozdílech mezi verzemi najdete v článku o verzích Durable Functions .
public class BillingIssuer : TaskOrchestrator<object?, string>
{
public override async Task<string> RunAsync(TaskOrchestrationContext context, object? input)
{
for (int i = 0; i < 10; i++)
{
await context.CreateTimer(TimeSpan.FromDays(1), CancellationToken.None);
await context.CallActivityAsync("SendBillingEvent");
}
return "done";
}
}
Výstraha
Vyhněte se nekonečným smyčkám ve funkcích orchestrátoru. Informace o bezpečném a efektivním implementaci scénářů nekonečné smyčky najdete v tématu Věčná orchestrace.
Výstraha
Vyhněte se nekonečným smyčkám v orchestracích. Informace o bezpečném a efektivním implementaci scénářů nekonečné smyčky najdete v tématu Věčná orchestrace.
Používejte trvalé časovače pro nastavení časových limitů
Tento příklad ukazuje, jak používat trvalé časovače k implementaci časových limitů:
[FunctionName("TryGetQuote")]
public static async Task<bool> Run(
[OrchestrationTrigger] IDurableOrchestrationContext context)
{
TimeSpan timeout = TimeSpan.FromSeconds(30);
DateTime deadline = context.CurrentUtcDateTime.Add(timeout);
using (var cts = new CancellationTokenSource())
{
Task activityTask = context.CallActivityAsync("GetQuote");
Task timeoutTask = context.CreateTimer(deadline, cts.Token);
Task winner = await Task.WhenAny(activityTask, timeoutTask);
if (winner == activityTask)
{
// success case
cts.Cancel();
return true;
}
else
{
// timeout case
return false;
}
}
}
Poznámka:
Předchozí příklad jazyka C# cílí na Durable Functions 2.x. Pro Durable Functions 1.x místo DurableOrchestrationContext použijte IDurableOrchestrationContext. Další informace o rozdílech mezi verzemi najdete v článku o verzích Durable Functions .
public class TryGetQuote : TaskOrchestrator<object?, bool>
{
public override async Task<bool> RunAsync(TaskOrchestrationContext context, object? input)
{
using var cts = new CancellationTokenSource();
Task<double> activityTask = context.CallActivityAsync<double>("GetQuote");
Task timeoutTask = context.CreateTimer(TimeSpan.FromSeconds(30), cts.Token);
Task winner = await Task.WhenAny(activityTask, timeoutTask);
if (winner == activityTask)
{
// success case
cts.Cancel();
return true;
}
else
{
// timeout case
return false;
}
}
}
Výstraha
V .NET, JavaScriptu, Python a PowerShellu zrušte všechny vytvořené trvalé časovače, pokud váš kód nečeká na jejich dokončení. V předchozích příkladech se dozvíte, jak zrušit čekající časovače. Framework trvalých úloh nezmění stav orchestrace na "Dokončeno", dokud nebudou dokončeny všechny nevyřízené úkoly, včetně odolných časovačových úloh, buď dokončené, nebo zrušené.
Výstraha
Pokud vaše sada SDK podporuje zrušení časovače (například v .NET), zrušte všechny vytvořené trvalé časovače v případech, kdy váš kód na ně nečeká, až se dokončí. V předchozích příkladech se dozvíte, jak zrušit čekající časovače. Framework trvalých úloh nezmění stav orchestrace na "Dokončeno", dokud nebudou dokončeny všechny nevyřízené úkoly, včetně odolných časovačových úloh, buď dokončené, nebo zrušené.
Tento mechanismus zrušení pomocí vzoru when-any neukončí aktuální funkce aktivity ani spuštění dílčí orchestraci. Místo toho jednoduše umožňuje funkci orchestrátoru ignorovat výsledek a pokračovat dál. Pokud vaše aplikace funkcí používá plán Consumption, stále se vám účtují náklady na čas a paměť, kterou nečinná funkce spotřebovává. Ve výchozím nastavení mají funkce spuštěné v plánu Consumption časový limit 5 minut. Pokud dojde k překročení tohoto limitu, hostitel služby Azure Functions se recykluje, aby zastavil veškeré spuštění a zabránil nekontrolovatelné situaci ohledně fakturace. Časový limit funkce je konfigurovatelný.
Podrobnější příklad implementace časových limitů ve funkcích orchestrátoru najdete v článku Lidské interakce .
Tento mechanismus zrušení pomocí vzoru kdykoli neukončí probíhající aktivity ani provádění procesů dílčí orchestrace. Místo toho jednoduše umožňuje orchestraci ignorovat výsledek a pokračovat dál.