Calling common async code from a derived method
In your code you create 2 boolean variables for a simple if statement conditional, personally I think that you shouldn't create these variables unless you are going to use them in more than one place or for complex condition statements.


        using (FleetContext db = CreateDatabaseContext())
        {
            bool isSystemOnline = await db.IsSystemOnlineAsync();
            if (!isSystemOnline)
            {
                return ImmutableApiResult&lt;TValue&gt;.Offline;
            }

            bool isValidSession = await db.IsValidSessionAsync(context.Caller);
            if (!isValidSession)
            {
                return ImmutableApiResult&lt;TValue&gt;.Blocked;
            }

            Task&lt;TValue&gt; task = getTask(db, context.CancellationToken);
            TValue value = await task;

            return ImmutableApiResult.Create&lt;TValue&gt;(value);
        }



You can also avoid creating the Task variable at the end as well and just create the value.

using (FleetContext db = CreateDatabaseContext())
{
    if (!(await db.IsSystemOnlineAsync()))
    {
        return ImmutableApiResult&lt;TValue&gt;.Offline;
    }
    else if (!(await db.IsValidSessionAsync(context.Caller)))
    {
        return ImmutableApiResult&lt;TValue&gt;.Blocked;
    }

    TValue value = await (getTask(db, context.CancellationToken));

    return ImmutableApiResult.Create&lt;TValue&gt;(value);
}


This shortens the code a little bit and gets straight to the point.  Nothing really wrong with the way that you did it, and I haven't really done anything different here either, I just...well... golfed it a bit I guess.  I just didn't think we needed to create all those variables