Преобразование асинхронной функции, запускающей событие, в ожидаемую функцию WP8

В windows phone 8 для чтения контактов с телефона есть только следующий код:

Dim WithEvents objContacts As New Microsoft.Phone.UserData.Contacts

Private Sub ReadContacts
objContacts.SearchAsync("", Microsoft.Phone.UserData.FilterKind.None, Nothing)
'Result will be read from the event
End Sub

'Event 

Private Sub A_SearchCompleted(sender As Object, e As Microsoft.Phone.UserData.ContactsSearchEventArgs) Handles A.SearchCompleted
Dim B = e.Results.ToList
End Sub

Мой вопрос: как я могу преобразовать эту функциональность в ожидаемую функцию в классе?

Пример:

Public Class Contacto

Public Async Function GetContacts() As System.Threading.Tasks.Task(Of List(Of Microsoft.Phone.UserData.Contact))

'Do some work: here's my question

End Function

End Class 


'So I can call my function


Dim o as new Contacto

dim Contacts = Await o.GetContacts()

Большое спасибо, я ценю ваши ответы.


person Sameh    schedule 22.11.2012    source источник


Ответы (2)


Если вы хотите вызвать await внутри своей функции, вам нужно будет добавить ключевое слово async

public async void functionname () //c# syntax
person ua741    schedule 23.11.2012
comment
Уважаемый @ap_amp, функция SearchAsync не является Awaitable, поэтому ее нельзя вызвать с помощью await: A = Await Awaitable, спасибо - person Sameh; 23.11.2012

Я нашел решение своего вопроса, используя класс System.Threading.Tasks.TaskCompletionSource.

Public Class CustomContacts
        Dim WithEvents objContacts As New Microsoft.Phone.UserData.Contacts
        Dim tcs As New System.Threading.Tasks.TaskCompletionSource(Of List(Of Microsoft.Phone.UserData.Contact))

        Public Async Function GetContacts() As System.Threading.Tasks.Task(Of List(Of Microsoft.Phone.UserData.Contact))
            objContacts.SearchAsync("", Microsoft.Phone.UserData.FilterKind.None, Nothing)
            Dim ListContacts = Await tcs.Task

           Return ListContacts
        End Function

        Private Sub objContacts_SearchCompleted(sender As Object, e As Microsoft.Phone.UserData.ContactsSearchEventArgs) Handles objContacts.SearchCompleted
            tcs.SetResult(e.Results.ToList)
        End Sub
    End Class


'So now I can call the function as follow:

dim objContacts as new CustomContacts
Dim myContacts = Await objContacts.GetContacts 'returns List(Of Microsoft.Phone.UserData.Contact)
person Sameh    schedule 23.11.2012