繁体   English   中英

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

Why do asynchronous calls in C# need to be declared as such if the method they reside in is declared with the 'async' keyword already?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

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

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

    public async Task<ActionResult> Create(MyObject myObject)
    {
    }

为什么我还必须明确指定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);
    }

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

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

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

2 个回复

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

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

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

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

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

Task t1 = SomeAsyncOperation();
Task t2 = SomeOtherAsyncOperation();
await Task.WhenAll(t1, t2);

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

await SomeAsyncOperation();
await SomeOtherAsyncOperation();

这些操作现在是顺序的。

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

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

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

await完全改变生成方法的代码的方式 - 状态机与线性代码 - 所以你不能用任何自定义.Await()方法神奇地实现它,因为方法调用被编译成线性代码。

C#通常选择显式方法与神奇猜测意图 - 所以虽然有些情况下编译器可能猜测需要await调用但它没有。

请注意,使用var ,通常无法进行猜测:

var displayId = db.MyObjects.MaxAsync(m => m.DisplayId);

displayId可以是Task或者如果编译器允许猜测丢失await它可能是int

1 如何使用async和await关键字进行异步调用

我正在使用支持异步和等待功能的Linq To Twitter。 我有赢的窗体应用程序,该应用程序在dll中调用方法来获取关注者。(当前,我只是返回一个整数,但是我想返回关注者,不知道该怎么做) 从Form调用的方法 从Twitter API“ GetTwitterFollo ...

2 使用C#中的关键字来声明变量内联

我目前正在使用v4.6.2开发一个C#项目,Visual Studio刚刚建议对下面的代码进行代码更改。 我的问题是,我从未见过用于以这种方式创建新变量实例的is关键字。 原始代码是: Visual Studio 2017建议: 我在'is'关键字上检查了Micros ...

2018-03-19 14:47:53 3 893   c#/ c#-6.0
3 为什么我需要在声明和调用中使用ref关键字?

重复: 调用者的“out”关键字的目的是什么? 为什么我需要在声明和调用中使用'ref'关键字。 例如,考虑以上功能。 如果我在没有ref关键字的情况下调用它 它会给我错误: 必须使用'ref'关键字传递参数'1' 为什么仅仅在方法签名中指定它是不够的? ...

8 在C中声明关键字

除了教科书上定义的关键字“ assert”之外,实际用例是什么? 它不是常用的关键字,因此很少有示例可以说明实际的实现及其在Code中的用法 ...

2019-03-28 16:32:22 1 67   c/ keyword
10 如果在 C++ 中未使用关键字“new”声明结构,我是否需要“删除”它?

我知道“删除”关键字旨在与以“新”初始化的结构一起使用。 但是,考虑以下结构: 如果我不使用“删除”,这个程序会导致内存泄漏吗? 还可以将“删除”与未使用关键字“new”初始化的结构一起使用吗? 我不确定这是否是使用结构的最佳方式,我也愿意接受其他解决方案。 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM