c# - 将基于任务的 C# 示例转换为 VB.Net 的问题
问题描述
我有以下使用 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
解决方案
您几乎正确地翻译了
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
- 只要方法返回 a 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)
or Threading.Tasks.Task.FromResult(response)
。
推荐阅读
- python - Python列表理解逻辑成示例
- python - 如何修复此错误?“语料库”未定义
- azure - 在发布时设置逻辑应用变量值 - http 调用
- c++ - 使用基类中现有类型的声明与在子类中创建类型别名
- numpy - 计算插值数据的二阶导数
- swift - 如何在复制/粘贴 Xcode 时修复损坏的缩进
- protocol-buffers - io.grpc.StatusRuntimeException:未实现:未知服务 opencensus.proto.agent.metrics.v1.MetricsService
- java - 如何使用 Spinner 下拉菜单更改 TextView 小部件上的文本
- javascript - 如何使用 javascript 代码从 webgl 着色器中获取统一值
- javascript - 如果为负数或正数,如何更改数字的颜色?