Azure / Azure/durabletask

Serialization of object containing Task<object> hangs task scheduling

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

Beschreibung

(On the vnext branch)

When we use the following code, and forget to "await" on the "ExecuteIt" method in AsyncErrorTask, scheduling the completed task hangs in serialization of the event data in JsonDataConverter, line 69.

public class EventData
{
public object Result { get; set; }
public string Exception { get; set; }
}

public class AsyncErrorTask : AsyncTaskActivity
{
protected async override Task ExecuteAsync(TaskContext context, string input)
{
await Task.Delay(10);

// FAILING:
return ExecuteIt();

// SUCCEEDING:
// return await ExecuteIt();
}

private Task ExecuteIt()
{
return Task.FromResult("Done");
}
}

public class AsyncWriteSuccessTask : AsyncTaskActivity
{
protected override Task ExecuteAsync(TaskContext context, EventData input)
{
Console.WriteLine($"[TASK]\r\n{input.Result}\r\n");
return Task.FromResult(string.Empty);
}
}

public class AsyncWriteErrorTask : AsyncTaskActivity
{
protected override Task ExecuteAsync(TaskContext context, EventData input)
{
Console.WriteLine($"[TASK]\r\n{input.Exception}\r\n");
return Task.FromResult(string.Empty);
}
}

public class AsyncErrorOrch : TaskOrchestration
{
public override async Task RunTask(OrchestrationContext context, object input)
{
var data = new EventData();

try
{
data.Result = await context.ScheduleTask(typeof(AsyncErrorTask), string.Empty);
await context.ScheduleTask(typeof (AsyncWriteSuccessTask), data);
return null;
}
catch (Exception ex)
{
data.Exception = ex.ToString();
await context.ScheduleTask(typeof (AsyncWriteErrorTask), data);
return null;
}
}
}

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Rechercherichtung

Beginne bei JsonDataConverter, Zeile 69, auf dem vnext-Branch, und reproduziere den Hänger mit dem bereitgestellten Beispiel für AsyncErrorTask und AsyncErrorOrch. Verfolge die Serialisierung des nicht erwarteten Task, der in EventData.Result gespeichert ist. Abgeschlossen ist die Aufgabe, wenn der bereitgestellte Workflow beim Planen des abgeschlossenen Tasks nicht mehr hängt.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
csharp
Bereich
backend, distributed-systems
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 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.