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()
方法,我可以追加?
难道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
关键字的使用将方法体转换为状态机; 方法调用不能这样做.
归档时间: |
|
查看次数: |
206 次 |
最近记录: |