Serialization of object containing Task<object> hangs task scheduling
- Lenguaje dominante
- C#
- Estrellas
- 1.7k
- Forks
- 335
- Merge medio
- 2 d 23 h
- PR fusionados (30 d)
- 6
Descripción
(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;
}
}
}
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
Línea de trabajo
Comienza en JsonDataConverter, línea 69, en la rama vnext, y reproduce el bloqueo con el ejemplo proporcionado de AsyncErrorTask y AsyncErrorOrch. Rastrea la serialización del Task no esperado almacenado en EventData.Result. Se considera terminado cuando el workflow proporcionado deja de bloquearse al programar la tarea completada.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- csharp
- Área
- backend, distributed-systems
- Tipo de issue
- Error
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100