代码之家  ›  专栏  ›  技术社区  ›  Sunil

将基于任务的C示例转换为VB.NET时出现问题

  •  0
  • Sunil  · 技术社区  · 6 年前

    我有以下使用system.threading.tasks.task类的c方法。

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
      {
        HttpResponseMessage response =
                                 new HttpResponseMessage(HttpStatusCode.InternalServerError);
        response.Content = new StringContent(Content);
        response.RequestMessage = Request;
        return Task.FromResult(response);
      }
    

    我在用vb.net编写上述代码时遇到一些问题。我已经尝试了以下操作,但是vs 2107显示了下面函数中最后一行的错误,它说 FromResult is not a member of Task .

    问题 :对于C方法的最后一行,VB.NET中C代码的正确等价物是什么?

    Public Async Function ExecuteAsync(ByVal cancellationToken As CancellationToken) As Task(Of HttpResponseMessage)
        Dim response As HttpResponseMessage = New HttpResponseMessage(HttpStatusCode.InternalServerError)
        response.Content = New StringContent(Content)
        response.RequestMessage = Request
        Return   Task.FromResult(Of HttpResponseMessage) (response) 'this line shows error
    End Function
    

    错误截图

    VB.Net error in Vs 2017 code editor

    包含此原始方法的完整C类如下所示。

    public class GlobalExceptionHandler : ExceptionHandler
    {
        public GlobalExceptionHandler()
        {
            //
            // TODO: Add constructor logic here
            //
    
        }
        public override void Handle(ExceptionHandlerContext context)
        {
            context.Result = new TextPlainErrorResult
                   {
                       Request = context.ExceptionContext.Request,
                       Content = "Oops! Sorry! Something went wrong." +
                                 "Our team has been informed and we will try to fix it as soon as possible."
                   };
            base.Handle(context);
        }
    
        private class TextPlainErrorResult : IHttpActionResult
        {
            public HttpRequestMessage Request { get; set; }
    
            public string Content { get; set; }
    
            public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
            {
                HttpResponseMessage response =
                                 new HttpResponseMessage(HttpStatusCode.InternalServerError);
                response.Content = new StringContent(Content);
                response.RequestMessage = Request;
                return Task.FromResult(response);
            }
        }
    }
    

    以上c代码转换后的vb.net代码如下。

    Public Class GlobalExceptionHandler
        Inherits ExceptionHandler
    
        Public Sub New()
        End Sub
    
        Public Overrides Sub Handle(ByVal context As ExceptionHandlerContext)
            context.Result = New TextPlainErrorResult With {
                .Request = context.ExceptionContext.Request,
                .Content = "Oops! Sorry! Something went wrong." & "Our team has been informed and we will try to fix it as soon as possible."
            }
            MyBase.Handle(context)
        End Sub
    
        Private Class TextPlainErrorResult
            Implements IHttpActionResult
    
            Public Property Request As HttpRequestMessage
            Public Property Content As String
    
            Public Function ExecuteAsync(ByVal cancellationToken As CancellationToken) As Task(Of HttpResponseMessage)
    
                Dim response As HttpResponseMessage = New HttpResponseMessage(HttpStatusCode.InternalServerError)
                response.Content = New StringContent(Content)
                response.RequestMessage = Request
    
                Return new Task.FromResult(response)
    
            End Function
        End Class
    End Class
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   GSerg    6 年前

    你几乎翻译正确了

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        HttpResponseMessage response =
                                 new HttpResponseMessage(HttpStatusCode.InternalServerError);
        response.Content = new StringContent(Content);
        response.RequestMessage = Request;
        return Task.FromResult(response);
    }
    

    作为

    Public Async Function ExecuteAsync(ByVal cancellationToken As CancellationToken) As Task(Of HttpResponseMessage)
        Dim response As HttpResponseMessage = New HttpResponseMessage(HttpStatusCode.InternalServerError)
        response.Content = New StringContent(Content)
        response.RequestMessage = Request
        Return Task.FromResult(Of HttpResponseMessage) (response) 'this line shows error
    End Function
    

    唯一的错误是增加了 Async 原版中没有,因此应删除:

    Public Function ExecuteAsync(ByVal cancellationToken As CancellationToken) As Task(Of HttpResponseMessage)
        Dim response As HttpResponseMessage = New HttpResponseMessage(HttpStatusCode.InternalServerError)
        response.Content = New StringContent(Content)
        response.RequestMessage = Request
        Return Task.FromResult(Of HttpResponseMessage) (response) 'this line shows error
    End Function
    

    异步的 不是方法签名的一部分,也不是编写可用于 await -只要方法返回 Task 可以等待。

    C原件不使用 async 在它的定义中,因为它实际上是同步的(你的vb翻译也是同步的)。使用 异步的 在这个函数上只会导致 compiler warning ,需要拆除 异步的 .

    使用 Task.FromResult(Of HttpResponseMessage) (response) is correct 甚至可以简化为 Task.FromResult(response) 因为编译器能够推断类型。

    如果对你来说它显示了一个错误关于 FromResult 不是的成员 任务 (哪个) certainly is )必须有另一个名为的类 任务 在解决方案中定义的 System.Threading.Tasks.Task 班级。在这种情况下,以更详细的方式引用它,例如 Tasks.Task.FromResult(response) Threading.Tasks.Task.FromResult(response) .

        2
  •  0
  •   Code Pope    6 年前

    移除 Task.FromResult 最后一行:

       Public Async Function ExecuteAsync(ByVal cancellationToken As CancellationToken) As Task(Of HttpResponseMessage)
            Dim response As HttpResponseMessage = New HttpResponseMessage(HttpStatusCode.InternalServerError)
            response.Content = New StringContent("")
            response.RequestMessage = Request
            Return   response 
        End Function