【问题标题】:Conversion - 'Result' is not a member of 'System.Threading.Tasks.Task'转换 - “结果”不是“System.Threading.Tasks.Task”的成员
【发布时间】:2014-01-14 23:54:16
【问题描述】:

使用 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 出现问题,提示“'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 数据吗?

谢谢!

【问题讨论】:

  • 您正在转换/转换为错误的语言 :-)
  • 我非常同意!但这就是部门中其他人都在使用的方法。
  • 我感觉您缺少扩展方法。您的所有导入都正确吗?
  • 哈哈!是的,我正在尝试将其转换为 VB.NET 而不是 C#。
  • 看起来它认为它的 Task 不是 Task&lt;T&gt;

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


【解决方案1】:

这是因为 VB.NET 类型推断在 Visual Studio 2010 中不是很好。您需要通过指定 client.GetAsync() 返回的 actual 类型来为编译器提供一些额外帮助,就像这样:

client _
   .GetAsync("api/products/2") _
   .ContinueWith( _
       Sub(t As Task(Of HttpResponseMessage))
           ...
       End Sub, _
       TaskScheduler.FromCurrentSynchronizationContext())

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

【讨论】:

  • 你摇滚!感谢您和所有尝试提供帮助的人!
  • @user3019291,很高兴为您提供帮助。你会发现类型推断在 VS2012/2013 中工作得更好,但现在请记住这个解决方法。
【解决方案2】:

试试这个:

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

【讨论】:

  • 我已经这样做了,但我仍然遇到与以前相同的问题。 “结果”不是“System.Threading.Tasks.Task”的成员。 t.IsFaulted 似乎没问题。 Intellisense 甚至显示 t.Result 应该可以工作。
【解决方案3】:

尝试将 lambda 从 Function 更改为 Sub。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    相关资源
    最近更新 更多