c# - 没有等待的异步编程?

标签 c# entity-framework asynchronous

我正在研究一系列使用 Entity Framework 执行许多不同数据库调用的方法。其中许多方法可以异步运行,因为我真的不关心它们的输出,也不依赖它们。

但是,当我尝试实现某些方法时,我收到编译器的警告:“因为未等待此调用,当前方法在调用完成之前继续运行”

但对我来说,这似乎是我想要的行为,因为我不关心这些方法的作用。

方法举例<​​/p>

public async Task SetupAccessControl(int objectTypeId, int objectId, int? organizationId)
{
    using (var context = new SupportContext(CustomerId))
    {
        ... // omitted for brevity
        if (objectTypeId == (int) ObjectType.User)
        {
            AddToUserRoleBridge("Everyone", objectId);//Warning on this line
            AddToUserRoleBridge("Default", objectId); //Warning on this line
        }
        ... // omitted for brevity
    }
}

public async Task AddToUserRoleBridge(string role, int userId)
{
    using (var context = new SupportContext(CustomerId))
    {
        var defaultRole = context.Roles.FirstOrDefault(n => n.Name == role);
        if (defaultRole != null)
        {
            var urb = new UserRoleBridge
            {
                RoleId = defaultRole.Id,
                UserId = userId
            };

            context.UserRoleBridges.Add(urb);
            await context.SaveChangesAsync();
        }
    }
} 

编辑

本质上,当我运行 main 函数时,我希望一系列方法调用同时触发,并在它们自己的线程中处理所有事情,这样我就不必担心了。这是一个伪代码示例。

public async void RunAllAsync() {
    taskA(*some value*);
    taskA(*some value*);
    taskB(*some value*);
    taskB(*some value*);

    await AllTasksCompleted
}

public async Task taskA(int item){
     //do something with item
}


public async Task taskB(int item) {
    subTaskB(*some value*)
    subTaskB(*some value*)
}

public async Task subTaskB(int item) {
    // do something
} 

在上面的示例中,当调用 #RunAllAsync 时,它进行的每个函数调用(以及它们进行的函数调用)都会同时触发。当所有这些调用完成后,任何名为 #RunAllAsync 的方法都将继续执行。

最佳答案

如果您不使用 await,则 async 关键字实际上没有任何用处,您可以将其关闭。您可以等待返回 Task 的方法,无论它是否标记为异步。

public Task DoSomethingAsync()
{
    Task someTaskJustLikeANormalReturnValue = Task.Delay(1000);
    return someTaskJustLikeANormalReturnValue;
}

// later...
public async Task SomeOtherFunction()
{
    // You can await DoSomethingAsync just like any async method, because
    // you're really awaiting the Task which got returned.
    await DoSomethingAsync();
}

在你的情况下,我可能会收集任务并一起等待它们:

    public async Task SetupAccessControl(int objectTypeId, int objectId, int? organizationId)
    {
        var tasks = new List<Task>();
        using (var context = new SupportContext(CustomerId))
        {
            ... // omitted for brevity
            if (objectTypeId == (int) ObjectType.User)
            {
                tasks.Add(AddToUserRoleBridge("Everyone", objectId));
                tasks.Add(AddToUserRoleBridge("Default", objectId));
            }
            ... // omitted for brevity
        }

        await Task.WhenAll(tasks.ToArray());
    }

这允许您将是否等待子任务的决定传递给调用者。如果异常发生在 AddToUserRoleBridge 中,这也将允许 any 调用者解包任何异常。

关于c# - 没有等待的异步编程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32911497/

相关文章:

c# - 从现有数据库 EF 5 生成 POCO(满足某些条件)

c# - 将验证附加到 MVC Controller / View 中使用的 EF 对象?

c# - 基于异步/等待的 Windows 服务中的同步 I/O

c# - TimeSpan.Parse 天元素范围从 0 到 10675199。为什么是这个数字?

c# - 扩展访问者/桥梁模式的两侧

c# - 如何正确确定Aero的非客户区大小?

c# - Entity Framework Core 2.0 中每种类型的表

asp.net-mvc - 无法定义两个对象之间的关系,因为它们附加到不同的ObjectContext对象mvc 2

c# - C#异步套接字客户端/服务器在服务器响应上挂起

ios - 如何在iOS中异步下载多张图片而不影响UI?