热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

c#ASP.NETWebApi,线程中的数据库连接

我在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实例作为您的后端


推荐阅读
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • 本文将介绍如何在混合开发(Hybrid)应用中实现Native与HTML5的交互,包括基本概念、学习目标以及具体的实现步骤。 ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • 本文介绍了如何使用Python爬取妙笔阁小说网仙侠系列中所有小说的信息,并将其保存为TXT和CSV格式。主要内容包括如何构造请求头以避免被网站封禁,以及如何利用XPath解析HTML并提取所需信息。 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • 本文详细解析了ASP.NET 2.0中的Callback机制,不仅介绍了基本的使用方法,还深入探讨了其背后的实现原理。通过对比Atlas框架,帮助读者更好地理解和应用这一机制。 ... [详细]
  • HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送www方式的数据。HTTP协议采用了请求响应模型。客服端向服务器发送一 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • 事件是程序各部分之间的一种通信方式,也是异步编程的一种实现形式。本文将详细介绍EventTarget接口及其相关方法,以及如何使用监听函数处理事件。 ... [详细]
  • python模块之正则
    re模块可以读懂你写的正则表达式根据你写的表达式去执行任务用re去操作正则正则表达式使用一些规则来检测一些字符串是否符合个人要求,从一段字符串中找到符合要求的内容。在 ... [详细]
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
author-avatar
手机用户2602939233
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有