【问题标题】:Use Task.FromResult for creating async action使用 Task.FromResult 创建异步操作
【发布时间】:2016-09-27 05:39:39
【问题描述】:

请考虑这种操作方法:

[HttpPost]
public async Task RemoveUserFromGroups(string connectionId, List<string> groupNames, string pusherAddress)
{
    var onlineUser = OnlineUser.Instance;
    await OnlineBusiness.RemoveUserFromGroups(onlineUser.Id, onlineUser.CustomerId, onlineUser.IsTrader, connectionId, groupNames, pusherAddress);
}

还有这个方法:

public static Task<bool> RemoveUserFromGroups(int userId, int customerId, bool isTrader, string connectionId, List<string> groupNames, string pusherAddress)
{
    return Task.FromResult(PusherBusiness.RemoveUserFromGroups(userId, customerId, isTrader, connectionId, groupNames, pusherAddress));
}

第三方库中的PusherBusiness 类在该类中调用Web 服务。 我想将我的控制器更改为异步模式。使用 Task.FromResult 并返回 Task 然后等待它是否正确? 这是异步的吗?

【问题讨论】:

    标签: c# asynchronous async-await


    【解决方案1】:

    没有。这根本不是异步的。

    这将同步运行,创建一个任务,等待已完成的任务(同步完成)并继续使用同一个线程。

    要实现异步,您需要在其中进行一些实际的异步操作。例如,如果 RemoveUserFromGroups 调用 Web 服务,它应该异步执行此操作并提供 RemoveUserFromGroupsAsync 或至少 Begin/EndRemoveUserFromGroups

    只要 is 不提供这种重载,您就无法真正进行异步操作。

    【讨论】:

    • @ShahroozJafari 您的代码所做的就是使用依赖项。只要该依赖项不支持异步,您就无能为力。
    • 如果值得这样做(Task.Run),您可以将其置于后台作业中。然而并不理想。
    猜你喜欢
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2017-07-22
    • 2014-11-27
    • 2018-06-05
    相关资源
    最近更新 更多