首页 \ 问答 \ 转换 - '结果'不是'System.Threading.Tasks.Task'的成员(Conversion - 'Result' is not a member of 'System.Threading.Tasks.Task')

转换 - '结果'不是'System.Threading.Tasks.Task'的成员(Conversion - 'Result' is not a member of 'System.Threading.Tasks.Task')

使用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数据?

谢谢!


Using VS 2010, VB.NET, HTTPClient, .NET 4.0, and Windows Forms.

I am trying to get a windows application to consume JSON coming from a Web API that I have created. Web API works great and I can view the results from a browser. Found this article that I have been trying to get working only using VB.NET instead of C#. http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-wpf-application

The critical part of the code is this function:

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());
}

I have tried to convert this to VB.NET but I am having issues with the t.Result saying "'Result' is not a member of 'System.Threading.Tasks.Task'."

Here is my attempt to convert it to 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

Any idea why I am getting this error and what am I missing in my code to allow me to catch the returning JSON data?

Thanks!


原文:https://stackoverflow.com/questions/21126519
更新时间:2020-06-18 11:06

最满意答案

这是因为VB.NET类型推断在Visual Studio 2010中并不是很好。您需要通过指定客户端返回的实际类型为编译器提供一些额外的帮助client.GetAsync() ,如下所示:

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

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


This is because VB.NET type inference is not great in Visual Studio 2010. You'll need to give the compiler a bit of extra help by specifying the actual type returned by your client.GetAsync(), like so:

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

Note: I've changed your Function to Sub because I didn't see any Return statements.

相关问答

更多

无法在SignalR中将类型'System.Threading.Tasks.Task '隐式转换为'string'(Cannot implicitly convert type 'System.Threading.Tasks.Task' to 'string' in SignalR)
不幸的是,您发布的代码不完整且远非清晰,从不介意有用。 请注意,例如,作为实际代码发布的代码实际上与您作为位图发布的代码不匹配。 (另请注意,位图,特别是那些描述仍为“在此处输入图像描述”的位图,无法通过网站自己的搜索功能或Bing和Google等搜索引擎以任何有意义的方式进行搜索。 但是,您获得的特定异常是非常典型的误用async方法。 在我看来,您可以通过将return语句更改为以下内容来使代码工作: return (string)context.Clients.All.RecevieNoti ...

无法将类型'System.Threading.Tasks.Task 隐式转换为'string'(Cannot implicitly convert type 'System.Threading.Tasks.Task to 'string')

试试这样: private async void btnSignIn_Click_1(object sender, RoutedEventArgs e) { Login._name = await ServiceClientObj.selectNameAsync(int.Parse(studentIdBox.Text)); Frame.Navigate(typeof(WelcomePage)); } 异步方法selectNameAsync返回Task<string> ,它是一种承 ...

不能隐式地将类型'bool'转换为'system.threading.tasks.task bool'(Cannot implicitly convert type 'bool' to 'system.threading.tasks.task bool')

您需要明确您是否希望此操作异步发生。 作为Async Operation的示例: public async Task<bool> login(string usn, string pwd) { DataClasses1DataContext auth = new DataClasses1DataContext(); var message = await (from p in auth.Users where p.usrName == usn & ...

跟踪已完成/正在运行的System.Threading.Tasks.Task对象(Tracking completed/running System.Threading.Tasks.Task objects)

您可以使用CancellationToken来实现此目的。 一旦发生OnStop事件,您只需在CancellationTokenSource上调用方法Cancel() ,它将传播到您传递令牌的所有任务。有几种技术如何正确取消任务。 如果请求取消,您可以在任务内部不时地进行明确检查。 或者我相信在令牌本身上有一个属性ThrowWhenCancelled,如果已经请求取消,则令牌将抛出CancellationException 。 如果您不关心任务结果,但想要有一个跟踪列表,只需将List<Task< ...

限制并发System.Threading.Tasks.Task的数量(Limiting the number of concurrent System.Threading.Tasks.Task)

设计时问题是并发任务的数量(以及内存占用量)将会爆炸,因为任务的输送速度比完成大数据文件要快。 我在考虑使用SemaphoreSlim 是的, SemaphoreSlim是限制并发异步操作的合适选择: private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(10); async Task ThrottledWorkAsync() { await _semaphore.WaitAsync(); try { aw ...

有没有办法表示System.Threading.Tasks.Task完成?(Is there a way to signal a System.Threading.Tasks.Task complete?)

据我的理解,它本质上是一个轻量级的线程。 不,这不是真的。 在某些情况下,我可以是真实的,但这只是Task的一种用法。 你可以通过传递一个委托来启动一个线程,并让它执行它(通常是异步的,可能是同步的,并且默认使用线程池)。 使用线程的另一种方式是通过使用TaskCompletionSource 。 当你这样做时,任务(可能)不会创建任何线程,使用线程池或任何沿着这些线的任何线程。 此模型的一个常见用法是将基于事件的API转换为基于任务的API: 让我们假设,仅仅因为这是一个常见的例子,我们希望有一 ...

不能隐式地将类型'void'转换为'System.Threading.Tasks.Task'(Cannot implicitly convert type 'void' to 'System.Threading.Tasks.Task')

由于您试图将所有调用的结果存储到任务的GetDataAsync中,因此您不应该等待它们。 只要取消await ,收集所有的任务,并在最后等待他们。 static void Run() { List<string> IDs = new List<string>() { "a", "b", "c", "d", "e", "f" }; Task[] tasks = new Task[IDs.Count]; for (int i = 0; i < IDs.Count; i++) ...

结束System.Threading.Tasks.Task的正确方法是什么?(What is the correct way to end a System.Threading.Tasks.Task?)

弯腰任务的正确方法是使用取消令牌 。 The proper way of stooping tasks is using cancellation tokens.

C#异步MVC方法返回ContentResult System.Threading.Tasks.Task`1 [System.Web.Mvc.JsonResult](C# Async MVC method returns ContentResult System.Threading.Tasks.Task`1[System.Web.Mvc.JsonResult])

在剥离了90%的代码以使其工作并逐渐添加它直到失败后,结果发现正在使用自定义的ControllerActionInvoker。 修复是将自定义调用程序更改为从AsyncControllerActionInvoker继承并覆盖BeginInvokeAction而不是InvokeAction。 AsyncControllerActionInvoker可以处理异步和同步方法。 After stripping out 90% of the code to get it working and gradua ...

转换 - '结果'不是'System.Threading.Tasks.Task'的成员(Conversion - 'Result' is not a member of 'System.Threading.Tasks.Task')

这是因为VB.NET类型推断在Visual Studio 2010中并不是很好。您需要通过指定客户端返回的实际类型为编译器提供一些额外的帮助client.GetAsync() ,如下所示: client _ .GetAsync("api/products/2") _ .ContinueWith( _ Sub(t As Task(Of HttpResponseMessage)) ... End Sub, _ TaskSche ...

相关文章

更多

最新问答

更多
  • 未捕获的不变违规:addComponentAsRefTo(...):只有ReactOwner可以有refs(Uncaught Invariant Violation: addComponentAsRefTo(…): Only a ReactOwner can have refs)
  • 通过嵌入式YouTube / Flash视频避免滚轮劫持(Avoid scroll-wheel hijack by embedded youtube / flash video)
  • 如何在多用户环境中处理表单编辑?(how to handle form editing in a Multi-user environment?)
  • PHP关闭MySQL连接(PHP close MySQL connection)
  • 我要微信下载
  • Solr dataimport处理程序查询(Solr dataimport handler query)
  • GIT是什么车.
  • Powershell错误处理和空结果(Powershell Error Handling and Null results)
  • Laravel按第二级值排序第一级集合(Laravel sorting 1st level collection by 2nd level value)
  • logback.xml到logback属性文件(logback.xml to logback property file)
  • 使用fgets和strcat时出现问题(Problems when using fgets and strcat)
  • 绘制熊猫数据框两栏(plot pandas dataframe two columns from)
  • 超全球$ _GET中是否保证键值对的顺序?(Is the order of key-value pairs guaranteed in the superglobal $_GET?)
  • C# - 检查两组索引值(C# - Checking Index values of two sets)
  • 模板中的URL输出为空(URL output in template is empty)
  • 关于redhat linux 9.0的三个镜像文件
  • 为什么要在go中分配对struct的引用?(Why assign a reference to a struct in go?)
  • Datagrid点击事件(Datagrid click event)
  • window.location.href在输入press时返回undefined(window.location.href on enter press returns undefined)
  • Javascript Array.remove()作者:John Resig - 为什么要在for-in语句中枚举?(Javascript Array.remove() by John Resig - why does it enumerate in for-in statement?)
  • sudo gem安装cocoapods --pre错误(sudo gem install cocoapods --pre error)
  • 加载完成后,在所有已加载的HTML文件中执行某些操作(After Load Complete, Do Something in All Loaded HTML Files)
  • 如何为wpf datagrid行应用样式(How to have style applied for wpf datagrid row)
  • 在debian上升级内核[关闭](Upgrade kernel on debian [closed])
  • 无法使用JavaScript FileReader API上传二进制文件(Trouble uploading binary files using JavaScript FileReader API)
  • 工作简历怎样写啊?电脑方面的
  • 查找通过gmail API检索的环聊和聊天消息的时间戳(Find timestamp for hangout and chat messages retrieved with gmail api)
  • 如果在汇编程序中没有退出系统调用,会发生什么情况?(What happens if there is no exit system call in an assembly program?)
  • 无法从Intranet访问Wordpress门户(Wordpress portal not accessible from intranet)
  • PDFBox:禁用字体缓存或更改其位置(PDFBox: Disable Font Cache or change its location)