- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个异步 asp.net Controller 。该 Controller 调用一个异步方法。实际执行异步 IO 工作的方法在我的应用程序的深处。 Controller 和链中最后一个方法之间的一系列方法都用 async 修饰符标记。这是我如何设置代码的示例:
public async Task<ActionResult> Index(int[] ids)
{
List<int> listOfDataPoints = dataPointService(ids);
List<Task> dpTaskList = new List<Task>();
foreach (var x in listOfDataPoints)
{
dpTaskList.Add(C_Async(x));
}
await Task.WhenAll(dpTaskList);
return View();
}
private async Task C_Async(int id)
{
//this method executes very fast
var idTemp = paddID(id);
await D_Async(idTemp);
}
private async Task D_Async(string id)
{
//this method executes very fast
await E_Async(id);
}
private async Task E_Async(string url)
{
//this method performs the actual async IO
result = await new WebClient().DownloadStringTaskAsync(new Uri(url))
saveContent(result);
}
如您所见, Controller 异步调用 C_Async(x),然后有一个到 E_Async 的异步方法链。 controller 和 E_Async 之间有方法,都带有 async 修饰符。是否存在性能损失,因为有些方法使用异步修改器但不执行任何异步 IO 工作?
注意:这是真实代码的简化版本,在 Controller 和 E_Async 方法之间有更多的异步方法。
最佳答案
是的。有一个惩罚(虽然不是很大),如果你不需要 async
就不要。这种模式通常称为“return await”,您几乎总是可以同时删除 async
和 await
。只需返回代表异步操作的已有任务:
private Task C_Async(int id)
{
// This method executes very fast
var idTemp = paddID(id);
return D_Async(idTemp);
}
private Task D_Async(string id)
{
// This method executes very fast
return E_Async(id);
}
在此特定情况下,Index
将仅等待
E_Async
返回的任务。这意味着在完成所有I/O
之后,下一行代码将直接是return View();
。 C_Async
和 D_Async
已在同步调用中运行并完成。
关于c# - 异步一直向下问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21072205/
我有一个在 Android 市场上相当流行的应用程序,它允许数以万计的用户按下一个按钮并向它发出语音命令。然后我就可以做很多不同的事情,比如给他们提供当前的天气预报等等...... 无论如何,我的应用
令人惊讶的是,标题基本上解释了它。我们有一个我们的客户制作的页面,我们正在重新创建该页面。 页面高度会一直增加,直到(我假设是这样)浏览器达到它的极限。我已经尝试过 Firebug 和 W3 验证器,
我是 react-native 的新手,试图创建我自己的组件,但它一直显示一个空屏幕。 这是我的组件代码 class BoxComponent extends Component { cons
我正在为我的 PHP 元素创建一个非常简单的博客,但遇到了一个简单的问题。我无法让我的页眉图像一直 float 。我有一个横幅,左边有一些文字,我有一个 1px 的切片,在可以选择的任何分辨率的宽度上
为什么我可以在另一个 Controller 的 View 中访问一个 Controller 的辅助方法?有没有办法在不破解/修补 Rails 的情况下禁用它? 最佳答案 @George Schreib
我正在使用带有最新 ADT 插件的 Eclipse Kepler SP2。每隔一分钟 Eclipse 就会说“为 Android 4.4.2 加载数据”并阻止我想做的一切。我在不同的文件夹中有几个 E
我是一名优秀的程序员,十分优秀!