【问题标题】:Issues converting Task based C# sample to VB.Net将基于任务的 C# 示例转换为 VB.Net 的问题
【发布时间】:2019-01-11 18:59:14
【问题描述】:

我有以下使用 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

错误截图

包含此原始方法的完整 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

【问题讨论】:

标签: c# vb.net visual-studio-2017


【解决方案1】:

你的翻译几乎正确

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

Async 不是方法签名的一部分,也不是编写可与 await 一起使用的方法的要求 - 只要该方法返回 Task,就可以等待。

C# 原版在其定义中没有使用async,因为它实际上是同步的(您的 VB 翻译也是如此)。在该函数上使用Async 只会导致compiler warning,修复这将需要删除Async

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

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

【讨论】:

  • 感谢您出色而详细的解释。现在很清楚了。我需要在 VB.Net 中找到一些解释你所拥有的东西的好书。
【解决方案2】:

去掉最后一行的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

【讨论】:

  • 我试过这个,但现在它给出了另一个错误:Value of type HttpResponseMessage cannot be converted to Task(Of HttpResponseMessage)
  • @Sunil 这是你得到的编译时错误?还是运行时错误?你怎么能得到那个?我尝试了该代码,但我既没有得到编译时间也没有得到运行时错误。
猜你喜欢
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多