草庐IT

Async-await

全部标签

c# - nunit 如何成功等待 async void 方法完成?

在C#中使用async/await时,一般规则是避免使用asyncvoid,因为这几乎是一劳永逸,而不是一个任务。说得通。奇怪的是,本周早些时候我正在为我编写的一些async方法编写一些单元测试,并注意到NUnit建议将async测试标记为void或返回Task。然后我尝试了一下,果然,它起作用了。这看起来真的很奇怪,因为nunit框架如何能够运行该方法并等待所有异步操作完成?如果它返回Task,它可以等待任务,然后做它需要做的事情,但是如果它返回void,它如何完成它呢?于是我破解了源码,找到了。我可以在一个小样本中重现它,但我根本无法理解他们在做什么。我想我不太了解Synchron

c# - nunit 如何成功等待 async void 方法完成?

在C#中使用async/await时,一般规则是避免使用asyncvoid,因为这几乎是一劳永逸,而不是一个任务。说得通。奇怪的是,本周早些时候我正在为我编写的一些async方法编写一些单元测试,并注意到NUnit建议将async测试标记为void或返回Task。然后我尝试了一下,果然,它起作用了。这看起来真的很奇怪,因为nunit框架如何能够运行该方法并等待所有异步操作完成?如果它返回Task,它可以等待任务,然后做它需要做的事情,但是如果它返回void,它如何完成它呢?于是我破解了源码,找到了。我可以在一个小样本中重现它,但我根本无法理解他们在做什么。我想我不太了解Synchron

c# - 使用 async/await 锁定资源

我有一个应用程序,其中有一个可以被多个客户端访问的共享资源(一个Motion系统)。我有个别操作需要在移动期间访问系统,如果同时请求冲突操作,它们应该抛出“忙碌”异常。我还有Sequencer,它需要获得对Motion系统的独占访问权限,以执行多个操作,穿插在其他操作中;在整个序列中,没有其他客户端能够运行操作。传统上,我使用线程亲和性来解决这个问题,这样线程就可以请求独占访问并运行与操作对应的阻塞调用。当线程可以访问时,其他线程不能使用该资源。我现在遇到的问题是我已经转向使用异步/等待模式来实现我的系统,以允许更清晰的音序器实现。问题是现在我的音序器并不总是在同一个线程上运行;事件线

c# - 使用 async/await 锁定资源

我有一个应用程序,其中有一个可以被多个客户端访问的共享资源(一个Motion系统)。我有个别操作需要在移动期间访问系统,如果同时请求冲突操作,它们应该抛出“忙碌”异常。我还有Sequencer,它需要获得对Motion系统的独占访问权限,以执行多个操作,穿插在其他操作中;在整个序列中,没有其他客户端能够运行操作。传统上,我使用线程亲和性来解决这个问题,这样线程就可以请求独占访问并运行与操作对应的阻塞调用。当线程可以访问时,其他线程不能使用该资源。我现在遇到的问题是我已经转向使用异步/等待模式来实现我的系统,以允许更清晰的音序器实现。问题是现在我的音序器并不总是在同一个线程上运行;事件线

c# - MVC 4 中的异步操作过滤器

我有一个Action过滤器,当在某些特定条件下使用时,它必须执行网络服务调用以确保当前状态有效。这最初似乎是async/await的理想选择,但我遇到了一个障碍:假设请求:/Test/FilteredActionMyCustomActionFilter开始执行到达第一个“await”语句TestController.FilteredAction开始执行MyCustomActionFilter恢复执行传统上我希望Action过滤器恢复执行然后在ControllerAction开始执行之前完成,但这并没有发生。现在我假设这是因为我正在使用:publicclassMyCustomAction

c# - MVC 4 中的异步操作过滤器

我有一个Action过滤器,当在某些特定条件下使用时,它必须执行网络服务调用以确保当前状态有效。这最初似乎是async/await的理想选择,但我遇到了一个障碍:假设请求:/Test/FilteredActionMyCustomActionFilter开始执行到达第一个“await”语句TestController.FilteredAction开始执行MyCustomActionFilter恢复执行传统上我希望Action过滤器恢复执行然后在ControllerAction开始执行之前完成,但这并没有发生。现在我假设这是因为我正在使用:publicclassMyCustomAction

c# - 基于等待任务的队列

我想知道是否存在ConcurrentQueue的实现/包装器,类似于BlockingCollection从集合中获取不会阻塞,而是异步的,并且会导致异步等待,直到将项目放入队列中。我想出了自己的实现方案,但它的表现似乎不如预期。我想知道我是否在重新发明已经存在的东西。这是我的实现:publicclassMessageQueue{ConcurrentQueuequeue=newConcurrentQueue();ConcurrentQueue>waitingQueue=newConcurrentQueue>();objectqueueSyncLock=newobject();public

c# - 基于等待任务的队列

我想知道是否存在ConcurrentQueue的实现/包装器,类似于BlockingCollection从集合中获取不会阻塞,而是异步的,并且会导致异步等待,直到将项目放入队列中。我想出了自己的实现方案,但它的表现似乎不如预期。我想知道我是否在重新发明已经存在的东西。这是我的实现:publicclassMessageQueue{ConcurrentQueuequeue=newConcurrentQueue();ConcurrentQueue>waitingQueue=newConcurrentQueue>();objectqueueSyncLock=newobject();public

c# - 将 HttpContext.Current.User 与异步等待一起使用的正确方法

我正在使用异步操作并像这样使用HttpContext.Current.UserpublicclassUserService:IUserService{publicILocPrincipalCurrent{get{returnHttpContext.Current.UserasILocPrincipal;}}}publicclassChannelService:IDisposable{//IntheservicelayerpublicChannelService():this(newEntities.LocDbContext(),newUserService()){}publicChan

c# - 将 HttpContext.Current.User 与异步等待一起使用的正确方法

我正在使用异步操作并像这样使用HttpContext.Current.UserpublicclassUserService:IUserService{publicILocPrincipalCurrent{get{returnHttpContext.Current.UserasILocPrincipal;}}}publicclassChannelService:IDisposable{//IntheservicelayerpublicChannelService():this(newEntities.LocDbContext(),newUserService()){}publicChan