How to use async/await with a library that uses an event-based asynchronous pattern?

.net-4.5, async-await, c#, c#-5.0, task-parallel-library

Solution

I will build on ws0205's answer:

First, you indicate that you want your method "to be called with `await`". You achieve this by returning a `Task`.

I also think that it's better to make the following adjustments to ws0205's answer:

public Task<Result> SomeMethod() //no async, since we're not awaiting anything
{
   var result = new TaskCompletionSource<Result>();

   library.WorkDone += (data) =>
                                {
                                    result.TrySetResult(data); //just in case 
                                };
   library.DoWork();

   return result.Task; //no need to await - we're returning a Task - let the caller await (or not)
}

Problem

I use a library that has an asynchronous method called DoWork(...) that will raise a WorkDone event when the operation completes. I would like to write a method that calls this library, but instead of maintaining the same pattern I would like my method to be `async` so it can be called with `await`. In essence, what I am trying to do is: ``` public async Task<Result> SomeMethod() { var result = new Task<Result>(); library.WorkDone += (data) => { result.Result = data; } library.DoWork(); return await result; } ``` (not working because Result is readonly) Can this be done?

Original source