【发布时间】:2016-01-15 21:17:18
【问题描述】:
我在我的 asp.net 应用程序的线程中使用数据库时遇到问题。 当我想启动我的应用程序时,我想用它启动一个名为“BackgroundWorker”的线程,该线程在后台运行,直到整个应用程序停止。
问题是线程中的 dbContext 存在大量问题。
我尝试在我的 Startup.cs 中的方法“ConfigureServices”或“Configure”中启动 walker,然后在 Walker 的构造函数中初始化 dbContext,就像这样“dbContext = new ApplicationContext()”它告诉我连接未配置,当我尝试在数据库上的 while(true) 队列中操作时。 如果我为 Walker 编写一个自己的控制器,它在他的构造函数中接收一个 ApplicationContext 然后像这样启动一个线程,如果我用 GET 请求调用这个控制器一次:
public BackgroundWorker(ChronicusContext dbContext)
{
_dbContext = dbContext;
_messageService = new MailMessageService();
}
// GET: api/backgroundworker
[HttpGet]
[Route("start")]
public void StartWorker()
{
//Thread thread = new Thread(this.DoBackGroundWork);
Thread thread = new Thread(() => DoBackGroundWork(this._dbContext));
thread.Start();
}
public void DoBackGroundWork(ChronicusContext _dbContext)
{
while (true)
{
if (_dbContext.PollModels.Any()) //Here is the exception
{
...
}
}
}
然后我收到一个 System.ObjectDisposedException,表明该对象已被放置在 while (true) 队列中。
我以许多不同的方式尝试了这些和类似的事情,但总是收到类似这两个或数据库连接关闭的异常。
有人可以帮助我并告诉我这是如何工作的吗?
谢谢!
【问题讨论】:
-
您的“while (true)”代码在哪个方法中?
-
你为什么要这样做?可能是一种更简单的方法来解决您遇到的任何问题,这使您想尝试在 Web 应用程序中使用这样的线程。一般来说(我的意思是一般来说,这是主观的),这是一个坏主意。
-
请解释一下这个项目的架构,您的 API 是否支持 Web 应用程序?
-
@GabrielLuci 编辑了我的问题。 whilte(true) 代码在 DoBackGroundWork() 方法中。 Nikki9696:我想要一个线程,每 30 秒在数据库中搜索一次,如果日期已过期,然后发送一封带有链接的电子邮件,指的是数据库中过期的那个 BrianOgden:我是编程初学者,所以我我不确定,你想听什么,但我试试看:我们有一个 asp.net 4.5 mvc 应用程序。与前端的通信是通过后端的 Restful Web Api 控制器和前端的 AngularJS 控制器进行的。我们首先为数据库使用 EntityFramework 7 代码。
标签: c# asp.net asp.net-mvc multithreading