Implementando AsyncCodeActivities (usando C # async / await)

Há muito tempo estou escrevendo classes AsyncCodeActivity personalizadas usando o seguinte modelo:

public sealed class MyActivity : AsyncCodeActivity<T>
{
    protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state)
    {
        var task = new Task<T>(this.Execute, state, CancellationToken.None, TaskCreationOptions.AttachedToParent);
        task.ContinueWith(s => callback(s));
        task.Start();
        return task;
    }

    protected override T EndExecute(AsyncCodeActivityContext context, IAsyncResult result)
    {
        var task = result as Task<T>;
        if (task.Exception != null)
        {
            // Error handling. Rethrow? Cancel?
        }

        return task.Result;
    }

    private T Execute(object state)
    {
        // Logic here
        return default(T);
    }
}

Eu tenho algumas perguntas sobre isso:

Qual é o caminho certo para lidar com exceções? Retornando? Definir o contexto como cancelado?Existe uma maneira elegante de escrevê-lo com a sintaxe async / await disponível agora?

obrigado

questionAnswers(1)

yourAnswerToTheQuestion