2016-10-27 16 views
0

以下のように私はVB.NETの機能を持っている:私は、DBから文書IDを返すようにしようとしているが、私はなぜSystem.Threading.Tasks.Task`1 [System.String]を返す非同期関数ですか?

System.Threading.Tasks.Task`を取得しています

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 

1 [System.String]

実際には "2"が返されます。これについて私を助けてください:私はこの機能に何が間違っているのですか?

更新ここ

は、呼び出される関数です:

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

しかし、テキストボックスの内側に、私は上記のテキストを取得してい

。ありがとう。

+0

質問を編集して、関数が呼び出されたコードも表示してください。 –

+0

更新された質問を確認してください。ありがとう。 – barsan

+0

おそらく 'GetIdDoc'の名前を' GetIdDocAsync'に変更して、非同期メソッドの一般的なパターンに従うべきです。 –

答えて

3

私はC#からですが、同じように動作する必要があります。新しい.Netバージョン(> = 4.5)では、async/awaitが実装されています。したがって、メソッドが非同期としてマークされ、タスク(常にそうであるはずです)を返す場合は、それを待つ必要があります。これは、メソッドを非同期としてマークする必要があることを意味します。長時間実行されているタスクの準備ができていると、それは内部値です返すまで

txtIDDoc_Detail.Text = await ApiData.GetIdDoc(); 

のawaitを待ち:だからあなたの呼び出しは次のようになります。すべての非同期メソッドはTaskを返します。メソッドが無効な場合は、タスクになります。それ以外の場合はTask<int>または他のタイプになります。だから、それを待って、あなたが実行し続けることができます。

+0

@Nkosiありがとう。編集されました。 – Sebi

+0

または何らかの理由で同期的に実行したい場合は、 'txtIDDoc_Detail.Text = ApiData.GetIdDoc.Result'を実行します。 –

+0

@BradleyUffner - 'ApiData.GetIdDoc.Result'はデッドロックを引き起こす可能性があります。 – Fabio

1

@Sebiが正しく、この場合にasyncawaitを使用する方法の偉大な説明を与える)が、あなたが結果を得ている理由を私は正確にを上拡大するつもりだという分かりますか。あなたは、タスクTask(Of String)インスタンスに.ToStringを呼び出しているので

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

は、

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

を返します実際の結果ではありません。 .ToStringをオーバーライドしない型は、Objectという振る舞いを継承します。これは、型の名前を文字列として返すだけです。

おそらく、この(非同期呼び出し)欲しい:それが完了した後にこれらの呼び出しのいずれかが実際にタスクの結果だろう

txtIDDoc_Detail.Text = ApiData.GetIdDoc().Result 

txtIDDoc_Detail.Text = await ApiData.GetIdDoc() 

またはこの(同期呼び出しを)。

+0

'ApiData.GetIdDoc()。Result 'はデッドロックを引き起こす可能性があります。詳細についてはこちらをご覧ください:[非同期コードでブロックしない](http://blog.stephencleary.com/2012/ 07/dont-block-on-async-code.html) – Fabio

+0

GetIdDoc();がデッドロックの原因になります。メソッドはMainThreadの結果を返します。メソッドはResultにアクセスしようとしている間にメソッドを返したいからです。 – Sebi

+0

問題を説明してくれてありがとう。 – barsan

関連する問題