I have the following code and while when calling it the expected way it works, it locks when I try to directly access the Result property of the task.
I wasn't expecting this, especially when I specify ConfigureAwait(false). Also I'm not sure if I should keep a reference of the instance (and dispose where?) returned by cancellationToken.Register method, which implements IDisposable.
public async void SomeUIThreadHandlerMethod()
{
// works
var contactsWorks = await instance.ScanContactsAsync(CancellationToken.None);
// Locks
var contactsLocks = instance.ScanContactsAsync(CancellationToken.None).Result;
// Locks
var contactsLocks = instance.ScanContactsAsync(CancellationToken.None).GetAwaiter().GetResult();
}
public async Task<ICollection<Contact>> ScanContactsAsync(CancellationToken cancellationToken)
{
var contactsCompletion = new TaskCompletionSource<ICollection<Contact>>();
try
{
cancellationToken.Register(state => ((TaskCompletionSource<ICollection<Contact>>)state).TrySetCanceled(), contactsCompletion);
var contacts = new Contacts();
contacts.SearchCompleted += (_, args) => contactsCompletion.TrySetResult(args.Results.ToArray());
contacts.SearchAsync(string.Empty, FilterKind.None, null);
}
catch (Exception ex)
{
contactsCompletion.TrySetException(ex);
}
return await contactsCompletion.Task.ConfigureAwait(false);
}