作者:手机用户2602939233 | 来源:互联网 | 2023-09-14 16:31
我在asp.net应用程序的线程中使用数据库时遇到问题.当我想启动我的应用程序时,我想用它启动一个名为“BackgroundWorker”的线程,该线程在后台运行,直到整个应用程序
我在asp.net应用程序的线程中使用数据库时遇到问题.
当我想启动我的应用程序时,我想用它启动一个名为“ BackgroundWorker”的线程,该线程在后台运行,直到整个应用程序停止.
问题是我在线程中的dbContext有很多问题.
II尝试通过“ ConfigureServices”或“ Configure”方法在Startup.cs中启动walker,然后像这样的“ dbCOntext= new ApplicationContext()”在Walker的构造函数中初始化dbContext,它告诉我连接不是配置,当我尝试在数据库的while(true)队列中进行操作时.
如果我为Walker编写了一个自己的控制器,该控制器在他的构造函数中接收到ApplicationContext,然后启动了这样的线程,如果我使用GET Request调用了该控制器一次:
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)队列中.
我以许多不同的方式尝试了这些和类似的东西,但是始终会收到像这两个这样的异常,或者数据库连接已关闭.
有人可以帮助我并告诉我这是如何工作的吗?
谢谢!
解决方法:
通常,用于Web应用程序的服务器端多线程并不经常发生,并且在大多数情况下是很大的不.
从概念上讲,您的服务器是“多线程”的,它处理来自客户端/用户/其他服务器的许多HTTP请求.对于移动和Web架构/设计,您的服务器处理多个请求,并且您的客户端正在处理异步调用,并等待诸如API方法StartWorker之类的长时间运行的调用的响应.
考虑这种情况,您向客户端的WebAPI方法StartWorker发出请求,使请求正在等待响应,将工作放在另一个线程上则无济于事,因为客户端仍在等待响应.
例如,让我们考虑您的客户端一个带有Ajax调用的HTML网页.您通过Ajax调用StartWorker,将把数据加载到HTML表中.从UX的角度来看,您将希望在长时间运行的StartWorker响应您的HTML Page Ajax调用请求时,放置一个进度条.当StartWorker响应时,Ajax调用将使用StartWorker响应加载HTML表. StartWorker必须响应数据.如果StartWorker事先作出响应,则您将必须通过SignalR发送推送通知,例如,当另一个线程完成并获得HTML表所需的数据时.
从Ajax请求/响应的角度来看,希望可以看到对WebAPI方法的调用花费的时间相同,因此在这种情况下(最常见的Web应用程序情况),多线程变得毫无意义.
您可以让您的客户端UI加载其他UI元素,并在HTML表UI区域中显示进度条,直到您的数据库调用完成并用数据响应您的Ajax调用为止.这样,您的用户就知道事情正在发生并且仍然在加载.
如果您仍然需要API中的其他线程来满足项目需求,那么我认为您必须使用Entity Framework 6或更高版本来支持异步查询,请参见本教程:
http://www.codeproject.com/Tips/805923/Asynchronous-programming-in-Web-API-ASP-NET-MVC
更新
现在,我知道您需要重复运行一次SQL查询,并且您有一个Azure Web App,如果要使用Sql Azure,则要使用的是Azure Automation,如果要使用Sql Server,则要使用的是Sql Server Job实例作为您的后端