小编Den*_*niz的帖子

ApiController中的长时间运行任务(使用WebAPI,自托管OWIN)

我想在自托管的OWIN环境中的ApiController中运行一个长时间运行的任务(比如4-5分钟).但是我想在启动该任务后(在我开始长时间运行的任务时)发回响应,而不等待它完成.这个长时间运行的任务与HTTP无关,并且顺序运行一些可能需要很长时间的方法.

我看看这篇博文,并决定尝试一下QueueBackgroundWorkItem.但是,我不确定是否可以在自托管(控制台应用程序)owin环境中使用此方法或使用它.在我认为的自托管控制台应用程序中,应用程序本身管理请求,并且所有请求都在同一AppDomain中运行(应用程序默认AppDomain,我们不创建任何新的appDomain),因此可能只需运行一个长时间运行的任务一种昙花一现的时尚,没有做任何特别的事情?

无论如何,当我使用时QueueBackgroundWorkItem,我总是得到错误:

<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>
Operation is not valid due to the current state of the object.
</ExceptionMessage>
<ExceptionType>System.InvalidOperationException</ExceptionType>
<StackTrace>
at System.Web.Hosting.HostingEnvironment.QueueBackgroundWorkItem(Func`2 workItem) at BenchMarkService.SmokeTestController.IsItWorking() in C:\Devel\Code\Projects\BenchMarkService\BenchMarkService\SmokeTestController.cs:line 18 at lambda_method(Closure , Object , Object[] ) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken) --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task …
Run Code Online (Sandbox Code Playgroud)

.net c# async-await asp.net-web-api owin

5
推荐指数
1
解决办法
1893
查看次数

EF 中的多线程和迁移 (MigrateDatabaseToLatestVersion)

我一直在MigrateDatabaseToLatestVersion用作数据库初始值设定项,以便在Seed迁移中使用方法。

为了了解有关 EF 中 DBinitializers 的更多信息,我查看了这篇博客文章。我不知道这篇文章是否仍然与 EF6 相关,但我认为提供了一个很好的概述。

在研究了数据库初始化的线程安全性和可能的​​竞争条件后,我对数据库初始化和播种的线程安全性和一致性有一些疑问。

1)首先数据库初始化是否线程安全?我MigrateDatabaseToLatestVersion在同一个 AppDomain 中使用和创建多个线程(每个线程创建一个新的 DbContext)。当我启动应用程序时,这些线程中的第一个应该初始化数据库(并且我认为也是第一次在 AppDomain 中播种)。在那种情况下,同一个 AppDomain 中的不同线程之间可能存在任何竞争条件吗?据说在单个 AppDomain 中初始化是线程安全的?

2)此外,多次调用SaveChanges()Seed方法是否是一种好习惯。例如:我有一个规范化的数据库,其中包含许多通过外键与其他表连接的表。如果我对每张桌子一一播种SaveChanges()并在同一张桌子上调用它们中的每一个,是否可能造成任何麻烦。例如。IDbInitializer另一个 AppDomain 中的另一个是否可以同时填充这些表?

3)据我所知,每个 AppDomainMigrateDatabaseToLatestVersion运行Seed一次该方法。所以,这意味着即使在同一个应用程序中,每个新的 AppDomain 实例都会尝试为同一个数据库播种,我认为这可能是一个性能瓶颈。有什么办法可以防止这种情况吗?

entity-framework entity-framework-6

5
推荐指数
0
解决办法
318
查看次数