Azure / Azure/durabletask

Orchestration will wait for all tasks to finish even Task.WhenAny is used

Offen
#415 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
enhancement
Vorherrschende Sprache
C#
Sterne
1.7k
Forks
335
Ø Merge
2 T. 23 Std.
Gemergte PRs (30 T.)
6

Beschreibung

I found that Task.WhenAny did not work with orchestration properly, the status of orchestration only become completed where all the scheduled tasks are finished.

My orchestration goes like:
```
public enum OperationState
{
Successful,

Failed,

InProgess,

Timeout
}

public class DummyOrchestration : TaskOrchestration
{
public override async Task RunTask(OrchestrationContext context, string input)
{
using (var timeoutCts = new CancellationTokenSource())
{
Task user = context.ScheduleTask(typeof(DummyActivity), input);
Task timer = context.CreateTimer(context.CurrentUtcDateTime.AddSeconds(60), OperationState.Timeout, timeoutCts.Token);

var resultTask = await Task.WhenAny(user, timer);
if(resultTask == user)
{
timeoutCts.Cancel();
}

Console.WriteLine($"{DateTimeOffset.Now}: Orchestration finished with {resultTask.Result}");
return resultTask.Result;
}
}
}
```

And my activity goes like:

```
public sealed class DummyActivity : AsyncTaskActivity
{
protected override async Task ExecuteAsync(TaskContext context, string input)
{
Console.WriteLine($"{DateTimeOffset.Now}: Dummy {input} recevied, will finished in one day!");

// Simulate some long running actions
await Task.Delay(TimeSpan.FromDays(1));

return OperationState.Successful;
}
}
```
From the console log, I could see that the orchestration RunTask code actually finished, but it behaves like the long running DummyActivity prevent its status to becoming completed and I could see there are 1 message in the workitem queue.

> 7/5/2020 7:22:38 PM +08:00: Dummy input1 recevied, will finished in one day!
> 7/5/2020 7:24:00 PM +08:00: Orchestration finished with Timeout

![image](https://user-images.githubusercontent.com/61817681/86531766-a18fa780-bef6-11ea-907d-6b7d3213066d.png)

From the [issue](https://github.com/Azure/durabletask/issues/155), I know for timer task, I could use an cancellation token to cancel any pending timers, but how can I cancel a long running TaskActivity?

Package information:

>
>
>

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Rechercherichtung

Beginne damit, die Orchestrierung mit DummyOrchestration.RunTask und DummyActivity.ExecuteAsync unter Verwendung der aufgeführten Paketversionen zu reproduzieren. Verfolge Task.WhenAny, die Abbruchlogik von CreateTimer und das Verhalten der Arbeitswarteschlange. Als erledigt gilt die Aufgabe, wenn die Orchestrierung nach dem Timeout ihren Endstatus erreicht, ohne auf die lang laufende Aktivität zu warten, und das erwartete Abbruchverhalten dokumentiert oder getestet ist.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
csharp
Bereich
backend, distributed-systems
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.