Questions tagged «async»

1
ASP.NET MVC中的异步控制器:真正的优势/如何实现?
我一直在阅读有关ASP.NET MVC中异步控制器方法的文章(http://visualstudiomagazine.com/articles/2013/07/23/async-actions-in-aspnet-mvc-4.aspx),我认为我可能错过了重点。 考虑一下我写的这种方法,它与文章中的示例非常相似: [HttpGet] [AsyncTimeout(8000)] [HandleError(ExceptionType = typeof(TimeoutException), View = "TimedOut")] public async Task<ActionResult> Index(CancellationToken cancellationToken) { WidgetPageViewModel model = new WidgetPageViewModel() { toAdd = new Widget() }; model.all = await _repo.GetAllAsync(cancellationToken); return View(model); } 据我了解,这是运行时事物将如何展开的方式: 将为传入的HTTP请求创建一个ASP.NET线程。 该线程将(已经完成了一些必要的初步工作)输入上述我的Index()方法。 执行将到达“ await”关键字,并在另一个线程上启动数据获取过程。 原始的“ ASP.NET”线程将返回调用我的处理程序方法的代码,并将Task类的实例作为返回值。 调用我的处理程序方法的基础结构代码将继续在原始的“ ASP.NET”线程上运行,直到达到需要使用实际ActionResult对象(例如,呈现页面)的程度。 然后,调用者将使用Task.Result成员访问此对象,这将使它(即“ ASP.NET”线程)等待上述步骤3中隐式创建的线程。 与没有等待/异步的同一件事相比,我看不到这完成了什么,除了我认为是琐碎的两件事: 由await创建的调用者线程和工作线程可以并行运行一段时间(上述#5的“直到”部分)。我的预感是这段时间很小。当基础结构调用控制器方法时,我认为它通常需要控制器调用的实际ActionResult才能做更多(如果有的话)。 有一些有用的新基础结构与超时和取消长时间运行的异步控制器操作有关。 添加异步控制器方法的目的应该是释放那些ASP.NET辅助线程以实际响应HTTP请求。这些线程是有限的资源。不幸的是,我没有看到文章中建议的模式实际上如何用于保存这些线程。即使这样做,并且以某种方式将处理请求的负担转移到了一些非ASP.NET线程上,那又完成了什么呢?碰巧能够处理HTTP请求的线程与一般线程有很大不同吗?


2
当线程在while循环内等待任务时,会发生什么?
在处理了C#的async / await模式一段时间之后,我突然意识到我不太了解如何解释以下代码中发生的情况: async void MyThread() { while (!_quit) { await GetWorkAsync(); } } GetWorkAsync()假定返回一个等待对象Task,该等待对象在执行继续操作时可能会或可能不会导致线程切换。 如果等待不在循环内,我不会感到困惑。我自然希望该方法的其余部分(即延续)可以在另一个线程上执行,这很好。 但是,在一个循环中,“其余方法”的概念让我有些迷惑。 如果线程是在连续状态下打开的,而线程没有被打开,那么“其余的循环”会怎样?在哪个线程上执行循环的下一个迭代? 我的观察表明(未最终验证),每个迭代都在同一线程(原始线程)上开始,而延续在另一个线程上执行。真的可以吗?如果是,那么这是否是某种程度的意外并行性,需要解决GetWorkAsync方法相对于线程安全性的问题? 更新:我的问题并非如某些人所建议的重复。该while (!_quit) { ... }代码模式仅仅是我的实际代码的简化。实际上,我的线程是一个长寿命的循环,它以固定的时间间隔(默认为每5秒)处理其工作项的输入队列。实际的退出条件检查也不是示例代码所建议的简单的字段检查,而是事件句柄检查。
10 c#  loops  async 

1
期货/单股vs事件
在可以忽略性能影响(最大每秒10-20个事件)的应用程序框架中, 什么是更可维护且更灵活的方法,可以用作模块之间进行通信的首选介质-事件还是期货/承诺/单子? 人们常说,事件(发布/订阅,中介)允许松散耦合,因此-应用程序更易于维护...我的经验否认这一点:一旦您拥有20多个事件,调试就会变得很困难,重构也会变得更加困难-因为很难看到:谁,何时何地使用什么。 承诺(我用Java语言编写)比事件要丑陋得多。但是:您可以清楚地看到函数调用之间的连接,因此应用程序逻辑变得更加简单明了。我怕什么 但是,Promises会带来更多的困难吗? ps:答案不一定基于JS,非常欢迎其他功能语言的经验。

4
如何保持连续性/回调的代码可读性?
简介:尽管使用了异步代码和回调,是否可以遵循一些完善的最佳实践模式来使代码保持可读性? 我正在使用一个JavaScript库,该库异步执行很多工作,并且严重依赖于回调。看来编写一个简单的“负载A,负载B ...”方法变得相当复杂,并且很难使用此模式进行操作。 让我举一个(人为的)例子。假设我要从远程Web服务器(异步)加载一堆图像。在C#/ async中,我将编写如下内容: disableStartButton(); foreach (myData in myRepository) { var result = await LoadImageAsync("http://my/server/GetImage?" + myData.Id); if (result.Success) { myData.Image = result.Data; } else { write("error loading Image " + myData.Id); return; } } write("success"); enableStartButton(); 代码布局遵循“事件流”:首先,禁用开始按钮,然后加载图像(await确保UI保持响应),然后再次启用开始按钮。 在JavaScript中,使用回调,我想到了这一点: disableStartButton(); var count = myRepository.length; function loadImage(i) { if (i …

1
在C#5.0中模糊异步和常规函数之间的界限
最近,我似乎对C#5.0 的惊人异步等待模式不够了解。我这辈子去哪了 我对简单的语法感到非常兴奋,但是我遇到了一个小困难。我的问题是异步函数的声明与常规函数完全不同。由于只有异步函数可以等待其他异步函数,因此当我尝试将一些旧的阻止代码移植到异步时,我产生了必须转换的函数的多米诺骨牌效应。 人们一直称其为僵尸大批出没。当异步在您的代码中被咬时,它将不断变得越来越大。移植过程并不困难,只需将其async放入声明中并用来包装返回值Task<>。但是在移植旧的同步代码时,一遍又一遍地执行此操作很烦人。 在我看来,如果两种函数类型(异步和普通旧同步)具有完全相同的语法,那将是自然得多的。如果是这种情况,移植将花费零的精力,我可以在两种形式之间轻松切换。 我认为如果遵循以下规则,这可能会起作用: 异步函数不再需要async声明。他们的返回类型不必包装Task<>。编译器将在编译期间自行识别异步函数,并根据需要自动执行Task <>包装。 不再需要对异步函数进行“一劳永逸”的调用。如果要调用异步函数,则需要等待它。无论如何,我几乎都不用一劳永逸,疯狂的比赛条件或僵局的所有例子似乎总是基于它们。我认为他们与我们试图利用的同步思维过于混乱和“脱节”。 如果您真的不能一劳永逸,那将有特殊的语法。无论如何,它不会成为我正在谈论的简单统一语法的一部分。 您需要表示异步调用的唯一关键字是await。如果您正在等待,则该调用是异步的。如果您不这样做,则该呼叫是普通的老式同步呼叫(请记住,我们不再具有即兴即弃的功能)。 编译器将自动识别异步函数(因为它们不再有特殊的声明了)。规则4使得此操作非常简单-如果函数await内部有调用,则它是异步的。 能行吗?还是我错过了什么?这种统一的语法更加流畅,可以完全解决僵尸的侵扰。 一些例子: // assume this is an async function (has await calls inside) int CalcRemoteBalanceAsync() { ... } // assume this is a regular sync function (has no await calls inside) int CalcRemoteBalance() { ... } // now …

1
设计接口和异步
假设我已经IFolderRepository使用以下方法创建了接口: IEnumerable<Folder> GetAllFolders(); Folder GetFolderWithId(int id); void AddFolder(Folder newFolder); void ModifyFolder(Folder folderToModify, Folder folderAfterModification); void RemoveFolder(Folder folderToRemove); 并且我已经实现了DatabaseFolderRepository,可以说CacheFolderRepositoryDecorator。现在,“数百行”之后,我想添加SkyDrive文件夹的功能,因此我准备添加SkyDriveFolderRepository。不幸的是,当DatabaseFolderRepository实现使用同步方法与数据库进行通信时,skydrive使用了很多async和await。在这种情况下该怎么办?在使用void方法将其标记为异步的情况下,这不是解决方案(需要进行异常处理)。我应该更改接口返回Task<T>吗?当然可以在上面的示例中使用,但是它们只是2个接口实现类。还是我的大多数接口都应该具有Task返回类型(因此您不需要规则)?
9 c#  async 

3
选择一个JavaScript Asynch-Loader [关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 5年前关闭。 我一直在研究各种异步资源加载器,但不确定使用哪一个。在我工作的地方,我们有不同的小组努力,他们的类模块可能使用不同版本的jQuery(等)。因此,嵌套的依赖关系也可能不同。我对此没有控制权,因此这意味着我需要动态加载可能使用同一库的替代版本的资源。 因此,这是我的要求: 异步加载JavaScript和CSS资源文件。 管理版本之间的依存关系顺序和嵌套依存关系。 检测资源是否已经加载。 必须允许跨域加载(CDN) (可选)允许我们卸载资源。 我一直在看: 卷曲 需求JS JavaScript的MVC 实验室 我可以通过将版本加载到适当命名的变量中并使用数组来跟踪已经加载的内容来伪造这些要求,但是(希望)有人已经发明了这个要求。 所以我的问题是: 您使用哪个?又为什么呢 还有其他我完全满足我要求的东西吗? 您觉得哪一个最有说服力且最容易使用?又为什么呢 更新: 对于那些感兴趣的人,我尝试了上面(以及更多)的所有AMD库。最后,我选择了RequireJS。整体上它更清洁,更容易...我很高兴能使用它。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.