2016-10-27 2 views
0

У меня есть функция VB.NET, как показано ниже:Почему функция Async возвращает System.Threading.Tasks.Task`1 [System.String]?

Public Shared Async Function GetIdDoc() As Task(Of String) 
    Dim result As String = "" 
    'Dim Uri As String = "http://localhost:53917/api/Documenti/GetNextIdDocumenti" 
    Dim Uri As String = apiUri & ApiEndPoints.GetNextIdDocumenti 

    Using client = New HttpClient() 
     Using response = Await client.GetAsync(Uri) 
      If response.IsSuccessStatusCode Then 
       Dim DocumentiIDJsonString = Await response.Content.ReadAsStringAsync() 
       result = DocumentiIDJsonString.ToString() 

      End If 
     End Using 
    End Using 
    Return result 
End Function 

Я пытаюсь вернуть Document ID из базы данных, но я получаю

System.Threading.Tasks.Task` 1 [System.String]

Где на самом деле он должен возвращать «2». Пожалуйста, помогите мне в этом: что я делаю неправильно с этой функцией?

Update

здесь функция называется:

txtIDDoc_Detail.Text = ApiData.GetIdDoc().ToString() 

Но внутри текстового поля я получаю выше текст. Благодарю.

+0

Измените свой вопрос, чтобы также показать код, в котором вызывается функция. –

+0

Пожалуйста, уточните мой обновленный вопрос. Благодарю. – barsan

+0

Возможно, вы должны переименовать 'GetIdDoc' в' GetIdDocAsync', чтобы следовать обычно рекомендуемому шаблону для методов async. –

ответ

3

Я из C#, но должен работать так же. В новых версиях .Net (> = 4.5) реализована функция async/await. Поэтому, если метод помечен как async и возвращает задание (это всегда должно быть так), вам нужно его ждать. Это подразумевает, что вы должны пометить свой метод как асинхронный. Таким образом, ваш вызов должен выглядеть следующим образом:

txtIDDoc_Detail.Text = await ApiData.GetIdDoc(); 

ждет жду, пока долго выполняющиеся задачи готовы и возвращают его внутреннее значение. Все методы async должны возвращать задачу. Если метод недействителен, это будет Задача. Иначе это может быть Task<int> или любой другой тип. Так ждут его, и вы можете продолжать работать;)

+0

@Nkosi Спасибо. Ред. – Sebi

+0

Или 'txtIDDoc_Detail.Text = ApiData.GetIdDoc.Result', если вы хотите запустить его синхронно (по какой-либо причине). –

+0

@BradleyUffner - 'ApiData.GetIdDoc.Result' может вызвать тупик. – Fabio

1

@Sebi дает большое объяснение того, как правильно использовать async и await в этом случае, но я собираюсь расширить именно почему вы получаете результат, ты видишь.

txtIDDoc_Detail.Text = ApiData.GetIdDoc().ToString() 

возвращается

System.Threading.Tasks.Task`1 [System.String]

Потому что вы звоните .ToString на экземпляра задачиTask(Of String), а не фактический результат. Типы, которые не переопределяют .ToString, наследуют поведение Object, которое просто возвращает имя типа в виде строки.

Вы, вероятно, хотите, чтобы это (асинхронный вызов):

txtIDDoc_Detail.Text = await ApiData.GetIdDoc() 

Или это (синхронный вызов):

txtIDDoc_Detail.Text = ApiData.GetIdDoc().Result 

Любой из этих вызовов будет на самом деле результат задачи после того, как он закончил.

+0

'ApiData.GetIdDoc(). Результат' может вызвать тупик, проверьте это для получения дополнительной информации: [Не блокировать код Async] (http://blog.stephencleary.com/2012/ 07/dont-block-on-async-code.html) – Fabio

+0

Это вызовет тупик, если GetIdDoc(); Метод возвращает результат в MainThread. Потому что метод хочет вернуть его, пока Result попытается получить к нему доступ. – Sebi

+0

Спасибо за объяснение моей проблемы. – barsan

Смежные вопросы