You can potentially still use the Task Parallel Library for your asynchronous tasks. Without going into too much implementation detail here, let's say you have a couple of method signatures which break apart the functionality into discrete components:
void FetchGoogleSearchResults(searchString);
void DisplayGoogleSearchResults(results);
The first method would internally call the second. There's nothing inherently asynchronous about either of these methods in how they're defined/implemented. They're normal methods which can even be called synchronously like any other if you'd like.
Then you might perform the first method asynchronously, where the second method sort of acts as its callback when it's complete. (Which it doesn't do asynchronously, just as the last thing it does in its thread.) You might invoke the first method like this:
Task.Run(() => FetchGoogleSearchResults("some search string"));
That should fork off a thread for the fetching of the Google results (which is the bottleneck, so that's what should be in the thread), and that thread will display the results when it's completed.