Проблемы преобразования образца C # на основе задач в VB.Net - PullRequest
0 голосов
/ 11 января 2019

У меня есть следующий метод C #, который использует класс System.Threading.Tasks.Task.

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

Преобразованный код VB.Net приведенного выше кода C # приведен ниже.

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 ]

0 голосов
/ 11 января 2019

Вы почти правильно перевели

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 для этой функции приведет только к предупреждению компилятора , исправление которого потребует удаления Async.

Использование Task.FromResult(Of HttpResponseMessage) (response) является правильным и может быть даже упрощено до Task.FromResult(response), потому что компилятор может вывести тип.

Если для вас отображается ошибка о том, что FromResult не является членом Task (который , безусловно, ), то в вашем решении должен быть другой класс с именем Task, который тени класса System.Threading.Tasks.Task. В этом случае обратитесь к нему более тщательно, например, Tasks.Task.FromResult(response) или Threading.Tasks.Task.FromResult(response).

0 голосов
/ 11 января 2019

Удалить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...