If I have a method where I want to perform some (potentially) long-running function and I want to put a limit on its execution time, I've been using this pattern (please pardon any errors in the code, typed by hand, not in an IDE, this is a simplification of a larger piece of code).
public string GetHello()
{
    var task = Task.Run(() => 
    {
        // do something long running
        return "Hello";
    });
    bool success = task.Wait(TimeSpan.FromMilliseconds(1000));
    if (success)
    {
        return task.Result;
    }
    else
    {
        throw new TimeoutException("Timed out.");
    }
}
If I want to use the GetHello method in an async capacity, i.e. public async Task<string> GetHello(), how would I do this while hopefully preserving a similar pattern?  I have the following, but I get compiler warnings about This async method lacks 'await' operators and will run synchronously as expected.
public async Task<string> GetHello()
{
    var task = Task.Run(async () => 
    {
        // await something long running
        return "Hello";
    });
    bool success = task.Wait(TimeSpan.FromMilliseconds(1000));
    if (success)
    {
        return task.Result;
    }
    else
    {
        throw new TimeoutException("Timed out.");
    }
}
I just don't know how to change this or where I would put await in order for this to work as expected.
 
    