【问题标题】:Interface Requiring Function That Returns Task接口需要返回任务的函数
【发布时间】:2019-01-18 10:34:53
【问题描述】:

我有一个接口需要某个返回任务的函数。在实现这个接口的一个类中,我不需要在这个函数中做任何事情。但是,这可以理解地向我提供了一个有用的警告:函数“MoveToNextField”不会在所有代码路径上返回值。使用结果时,运行时可能会发生空引用异常。

Public Function MoveToNextField() As Task Implements FormObjects.Interfaces.IViewer.MoveToNextField

End Function

这会带来一个问题,因为调用它的代码(如下)将等待此函数。如果我没有返回任何东西,我会得到一个空引用异常。

await objExample.MoveToNextField()

但是,由于我没有什么可等待的,将函数更改为以下也会给我一个警告:此异步函数缺少“等待”运算符,因此将同步运行。考虑使用“Await”运算符来等待非阻塞 API 调用,或使用“Await Task.Run(...)”在后台线程上执行 CPU 密集型工作。

Public Async Function MoveToNextField() As Task Implements FormObjects.Interfaces.IViewer.MoveToNextField

End Function

所以,我的问题是:解决这个问题的最正确方法是什么?下面的代码可以正常工作并且不会产生任何错误,但我不相信这是最好的方法:

Public Function MoveToNextField() As Task Implements FormObjects.Interfaces.IViewer.MoveToNextField
    Return Task.Run(Sub()
                    End Sub)
End Function

【问题讨论】:

  • 如果你必须有一个方法体怎么办Return Task.CompletedTask

标签: .net vb.net async-await task


【解决方案1】:

你可以Return Task.CompletedTask。这在您描述的需要满足返回任务的接口方法的情况下很有用,但您在具体实现中没有等待。

Public Function MoveToNextField() As Task Implements FormObjects.Interfaces.IViewer.MoveToNextField
    Return Task.CompletedTask
End Function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多