转换 - '结果'不是'System.Threading.Tasks.Task'的成员

时间:2014-01-14 23:54:17

标签: c# vb.net asp.net-web-api dotnet-httpclient vb.net-to-c#

使用VS 2010,VB.NET,HTTPClient,.NET 4.0和Windows窗体。

我正在尝试让Windows应用程序使用来自我创建的Web API的JSON。 Web API运行良好,我可以从浏览器查看结果。发现这篇文章我一直试图只使用VB.NET而不是C#。 http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-wpf-application

代码的关键部分是这个功能:

private void GetProducts(object sender, RoutedEventArgs e)
{
btnGetProducts.IsEnabled = false;

client.GetAsync("api/products/2").ContinueWith((t) =>
{
    if (t.IsFaulted)
    {
        MessageBox.Show(t.Exception.Message);
        btnGetProducts.IsEnabled = true;
    }
    else
    {
        var response = t.Result;
        if (response.IsSuccessStatusCode)
        {
            response.Content.ReadAsAsync<IEnumerable<Product>>().
                ContinueWith(t2 =>
                    {
                        if (t2.IsFaulted)
                        {
                            MessageBox.Show(t2.Exception.Message);
                            btnGetProducts.IsEnabled = true;
                        }
                        else
                        {
                            var products = t2.Result;
                            _products.CopyFrom(products);
                            btnGetProducts.IsEnabled = true;
                        }
                    }, TaskScheduler.FromCurrentSynchronizationContext());
        }

    }
}, TaskScheduler.FromCurrentSynchronizationContext());
}

我试图将其转换为VB.NET,但我遇到了t.Result的问题,说''结果'不是'System.Threading.Tasks.Task'的成员。“

这是我尝试将其转换为VB.NET:

Private Sub GetProducts(sender As Object, e As RoutedEventArgs)
    btnGetProducts.IsEnabled = False

    client.GetAsync("api/products/2") _
        .ContinueWith(Of HttpResponseMessage) _
        (Function(t)
             If t.IsFaulted Then
                 MessageBox.Show(t.Exception.Message)
                 btnGetProducts.IsEnabled = True
             Else

                 '***************************************************************
                 Dim response = t.Result 'This is the line that is giving me grief. Error Msg: 'Result' is not a member of 'System.Threading.Tasks.Task'.
                 '***************************************************************

                 If response.IsSuccessStatusCode Then
                     response.Content.ReadAsAsync(Of IEnumerable(Of SendNotice)).ContinueWith _
                         (Function(t2)
                              If t2.IsFaulted Then
                                  MessageBox.Show(t2.Exception.Message)
                                  btnGetProducts.IsEnabled = True
                              Else
                                  Dim products = t2.Result
                                  _lstSN.CopyFrom(products)
                                  btnGetProducts.IsEnabled = True
                              End If

                          End Function, TaskScheduler.FromCurrentSynchronizationContext())

                 End If
             End If

         End Function, TaskScheduler.FromCurrentSynchronizationContext())
End Sub

知道我为什么会收到此错误以及我在代码中缺少什么以便能够捕获返回的JSON数据?

谢谢!

3 个答案:

答案 0 :(得分:6)

这是因为VB.NET类型推断在Visual Studio 2010中并不是很好。您需要通过指定{{1>返回的实际类型为编译器提供一些额外的帮助。像这样:

client.GetAsync()

注意:我已将您的功能更改为Sub,因为我没有看到任何Return语句。

答案 1 :(得分:0)

试试这个:

client.GetAsync("api/products/2") _
        .ContinueWith(Sub(t)
                       If t.IsFaulted Then
                       .
                       .
                       .

答案 2 :(得分:-1)

尝试将lambda从Function更改为Sub。