为什么C#中的异步调用需要声明,如果它们所在的方法已经使用'async'关键字声明?

Rea*_*ues 3 c# linq architecture asynchronous

现在,有99%的可能性,我发现的这个"挑剔"完全是由于我自己的无知 - 我是一个初级网络开发人员,他只偶尔接触过C#几个月,所以我提前道歉我的问题很可能是愚蠢的.我的大部分经验都是使用PHP和JS.

如果我有一个用async关键字声明的方法:

    public async Task<ActionResult> Create(MyObject myObject)
    {
    }
Run Code Online (Sandbox Code Playgroud)

为什么我还必须明确指定LINQ语句是异步的,如下所示:

    public async Task<ActionResult> Create(MyObject myObject)
    {
        if (ModelState.IsValid)
        {
            myObject.Id = Guid.NewGuid();
            myObject.DisplayId = await db.MyObjects.MaxAsync(m => m.DisplayId) + 1;
            db.MyObjects.Add(myObject);
            await db.SaveChangesAsync();
            return RedirectToAction("Index");
        }
        return View(myObject);
    }
Run Code Online (Sandbox Code Playgroud)

难道C#编译器不能聪明地弄清楚因为该方法是异步的,我想在方法中执行的LINQ语句也应该是异步的吗?

我想我这个真牛的是,现在有大多数LINQ方法(异步双SaveChangesAsync,MaxAsync,FirstOrDefaultAsync),我不得不用await我想要执行这样的电话,每次关键字.这似乎过于冗长和不必要.

如果仍需要在通话的同步精细的控制,为什么没有C#开发人员只是允许的.Await(),.Async()Sync()方法,我可以追加?

Tho*_*que 5

难道C#编译器不能聪明地弄清楚因为该方法是异步的,我想在方法中执行的LINQ语句也应该是异步的吗?

如果要在异步方法中进行同步调用,该怎么办?

您是否希望同一方法同步或异步,具体取决于您是否使用异步方法?我想一种语言可能会这样做,但它需要一个与C#使用的模型不同的根本不同的模型.另外,我不确定这是个好主意; 这可能会令人困惑.最好把事情做成明确的IMO.

我想我的真正优势在于现在大多数LINQ方法都存在异步双胞胎(SaveChangesAsync,MaxAsync,FirstOrDefaultAsync),每次我想执行此类调用时都必须使用await关键字.这似乎过于冗长和不必要.

使用await与否具有相同的含义.如果不使用await,则只需检索任务,这在某些情况下很有用(例如,如果要并行化任务.例如,请考虑以下事项:

Task t1 = SomeAsyncOperation();
Task t2 = SomeOtherAsyncOperation();
await Task.WhenAll(t1, t2);
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,操作并行运行.现在,如果您在每次通话时使用等待:

await SomeAsyncOperation();
await SomeOtherAsyncOperation();
Run Code Online (Sandbox Code Playgroud)

这些操作现在是顺序的.

开发人员需要控制这种事情.这就是为什么await不能隐含,因为它改变了代码的行为.

如果仍然需要对调用的同步性进行精细控制,为什么C#开发人员不能简单地允许我可以附加的.Await()或.Async()方法?

.Await()方法如何比关键字更好?无论如何,它不会起作用.await关键字的使用将方法体转换为状态机; 方法调用不能这样做.