在这里使用任务有优势吗

Is there an advantage to using a task here

我有一个方法正在考虑使用任务来完成一些工作。但在这种情况下真的有优势吗?我的推理是因为 CheckInToWebDocs 方法依赖于 SaveDocument.

创建的文件的存在

没有任务

 Private Sub PopulatePDF()
     Dim PrintLib As New Print
        Dim sPDFFilePath As String = ""
        If PrintLib.CreateEnrolledApp(EnrollmentID, sPDFFilePath) Then
           AppName = Page.ResolveUrl("~\SomeLocation\" & Path.GetFileName(sPDFFilePath))
           hlApplication.NavigateUrl = AppName

           SaveDocument(Constants.enumDocumentTypes.Application, EnrollmentID, Path.GetFileName(sPDFFilePath), sPDFFilePath)

           CheckInToWebDocs(EnrollmentID, sPDFFilePath)
        End If
    End Sub

使用任务

 Private Sub PopulatePDF()
        Dim PrintLib As New Print
        Dim sPDFFilePath As String = ""
        If PrintLib.CreateEnrolledApp(EnrollmentID, sPDFFilePath) Then
            AppName = Page.ResolveUrl("~\SomeLocation\" & Path.GetFileName(sPDFFilePath))
            hlApplication.NavigateUrl = AppName

            Dim saveDocumentTask As Task = Task.Run(Sub() SaveDocument(Constants.enumDocumentTypes.Application, EnrollmentID, Path.GetFileName(sPDFFilePath), sPDFFilePath))
            saveDocumentTask.Wait()

            CheckInToWebDocs(EnrollmentID, sPDFFilePath)
        End If
    End Sub

不是您使用它的方式。它会增加并行任务的开销,但您仍然需要等待任务完成。

是否有 SaveDocument 的异步变体?如果是这样,那么您可以创建自己的 PopulatePDF() 异步方法,调用 Await SaveDocumentAsync(...)(如果命名遵循约定)。然后 PopulatePDF 的任何消费者都可以 是异步的,包括对 UI 事件的响应,这些事件会给你带来我认为你正在寻找的好处。


对评论的回复:真可惜。在这种情况下我要说的是:将 Task.Run 添加到您的实施中仍然没有任何好处。这可能很诱人,但您需要注意这会产生一个新线程。也就是说,如果你这样做:

Private Async Function PreparePdfAsync() As Task
  ...
  Await Task.Run(Sub() SaveDocument(...))
  ...
End Function

您只会在后台线程上获得 伪造 异步代码——同步代码 运行。在 UI 场景中,您最好的选择是让 UI 消费者在需要时自行调用 Task.Run(),不要将这些细节隐藏起来,因为线程生成是非明显且可能有害的行为。

有关 Task.Run etiquette 的更多信息,请参阅 Stephen Cleary,如果您是 Async/Await 的新手,请务必阅读他的其他介绍文章。