【问题标题】:Running .Net Tasks in parallel that return different objects并行运行返回不同对象的 .Net 任务
【发布时间】:2013-09-10 22:37:30
【问题描述】:

我目前正在研究处理来自 WCF 服务的 2 个数据下载,这些服务返回不同对象的集合,并且想知道是否有比同步运行这两个异步任务更好的方法。

在这种情况下,我可以实现Task.WhenAllTask.WhenAny 方法来并行运行这些任务吗?

Public Property Users As IEnumerable(Of UserDto)
    Get
        Return _users
    End Get
    Set(value As IEnumerable(Of UserDto))
        _users = value
        RaisePropertyChanged("Users")
    End Set
End Property

Public Property ApplicationRoles() As IEnumerable(Of ApplicationRoleDto)
    Get
        Return _roles
    End Get
    Set(ByVal value As IEnumerable(Of ApplicationRoleDto))
        _roles = value
        RaisePropertyChanged("ApplicationRoles")
    End Set
End Property

Private Async Sub GetUserDetails()
    Users = Await _serviceHelper.GetUsers()
    ApplicationRoles = Await _serviceHelper.GetApplicationRoles
End Sub

可能的解决方案

我可以使用Task Parrallel Library,但我不确定这是否是最有效的方法,而且我不能等待返回。

Parallel.Invoke(Sub() Users = _serviceHelper.GetUsers(),
                    Sub() ApplicationRoles = _serviceHelper.GetApplicationRoles())

【问题讨论】:

    标签: vb.net task-parallel-library .net-4.5 async-await


    【解决方案1】:

    Task.WhenAll 应该可以正常工作。如果语法不完全正确,请原谅;我的 VB 非常生锈:

    Private Async Function GetUserDetailsAsync() As Task
      Dim UsersTask = _serviceHelper.GetUsersAsync()
      Dim ApplicationRolesTask = _serviceHelper.GetApplicationRolesAsync
      Await Task.WhenAll(UsersTask, ApplicationRolesTask);
      Users = Await UsersTask
      ApplicationRoles = Await ApplicationRolesTask
    End Function
    

    我还冒昧地将您的Sub 更改为Function(您应该避免使用Async Sub),并使您的Async 方法以Asyncas per the convention 结尾。

    【讨论】:

    • 看起来不错。是否有理由像在 Users = Await UsersTask 中那样等待结果而不是调用 Users = UsersTask.Result?
    • Result 会将任何异常都包含在AggregateException 中,因此我更喜欢Await
    猜你喜欢
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多