如何在asp.net中使用多线程及队列,异步处理一个耗时的任务(原创)
最近想在使用.net 的队列处理一些耗时的工作。经过考虑,需要先设计一个类,类中包含一个静态的队列。主要是写队列和读取队列。
public class PaperCalculator
{
// 用于存放需要计算总分的试卷的计算任务的队列
private static Queue<string> _paperQueue; // 用于通知是否有新试卷需要处理的“信号器”
private static ManualResetEvent _hasNew;
// 用于写日志的线程
private static Thread _loggingThread;
static PaperCalculator()
{
_paperQueue = new Queue<string>();
_hasNew = new ManualResetEvent(false); _loggingThread = new Thread(Process);
_loggingThread.IsBackground = true;
_loggingThread.Start(); } // 处理队列中的任务
private static void Process()
{
while (true)
{
// 等待接收信号,阻塞线程。
_hasNew.WaitOne(); // 接收到信号后,重置“信号器”,信号关闭。
_hasNew.Reset();
Calculate(); }
} private static void Calculate()
{
var i = ;
while(_paperQueue.Count <= )
{
File.AppendAllText("d:\\paper-calculate-log.txt", DateTime.Now + ": 空循环-" + i + Environment.NewLine);
_hasNew.Reset();
Thread.Sleep();
}
string paperGuid =_paperQueue.Count>?_paperQueue.Dequeue():"未获取到paperGuid";//从队列的开始出返回一个对象;
File.AppendAllText("d:\\paper-calculate-log.txt", DateTime.Now + ":" + paperGuid + "客观分数计算完成" + "当前队列数目:" + _paperQueue.Count + Environment.NewLine);
_hasNew.Set();
}
static bool isFirst = true; // 公开一个Add方法,用于向队列中添加内容然后供外部调用
public static void Add(string paperGuid)
{
_paperQueue.Enqueue(paperGuid);
if (isFirst)
{
isFirst = false;
_hasNew.Set();
}
}
}
2.添加一个调用的入口:
public class HomeController : Controller
{
public ActionResult Index()
{ Task.Run(() =>
{
for (var i = ; i < ; i++)
{
PaperCalculator.Add(i+"----index-task-sj" + Guid.NewGuid().ToString());
Thread.Sleep();
} }); return View();
}
}
访问Home/Index,页面迅速结束,task的多线程任然继续工作,直到循环500次后结束,或者IIS重启后。
如何在asp.net中使用多线程及队列,异步处理一个耗时的任务(原创)的更多相关文章
- 如何在ASP.Net中实现RSA加密
在我们实际运用中,加密是保证数据安全的重要手段.以前使用ASP时,对数据加密可以使用MD5和SHA1算法,这两种算法虽然快捷有效,但是无法对通过它们加密的密文进行反运算,即是解密.因此需要解密数据的场 ...
- 如何在ASP.NET Core程序启动时运行异步任务(3)
原文:Running async tasks on app startup in ASP.NET Core (Part 3) 作者:Andrew Lock 译者:Lamond Lu 之前我写了两篇有关 ...
- 示例 - 如何在ASP.NET中应用Spider Studio生成的DLL?
>> 接前文 "示例 - 如何在Console应用程序中应用SpiderStudio生成的DLL?", 将其运用到ASP.NET中: 1. 创建WebApplicati ...
- (译)如何在ASP.NET中安全使用ViewState
原文:http://www.codeproject.com/Articles/150688/How-to-make-ViewState-secure-in-ASP-NET 介绍 ASP.NET中的Vi ...
- 如何在ASP.NET Core程序启动时运行异步任务(2)
原文:Running async tasks on app startup in ASP.NET Core (Part 2) 作者:Andrew Lock 译者:Lamond Lu 在我的上一篇博客中 ...
- 如何在ASP.NET Core程序启动时运行异步任务(1)
原文:Running async tasks on app startup in ASP.NET Core (Part 1) 作者:Andrew Lock 译者:Lamond Lu 背景 当我们做项目 ...
- 如何在asp.net中获取GridView隐藏列的值?
在阅读本文之前,我获取gridview某行某列的值一般做法是这样的:row.Cells[3].Text.ToString().有点傻瓜呵呵 在Asp.net 2.0中增加了一个新的数据绑定控件:Gri ...
- 如何在Asp.net中备份Access数据库?
public void Create( string mdbPath ) { if( File.Exists(mdbPath) ) //检查数据库是否已存在 { thr ...
- 如何在Asp.Net中使用JQueryEasyUI
JQueryEasyUI的基本信息: 官方下载 官方演示 官方文档 一.jQuery easyUI下载后解压的文件目录如下图: demo:JQueryEasyUI的一些示例页面,在项目使用可以将该目录 ...
随机推荐
- [转]SQLServer2008日志文件无法收缩处理方法
问题描述 发现有的数据库日志文件太大,无论如何收缩执行几次SQL语句都不行.事务日志达30+G,而且使用常规的截断.收缩方法均无法减小日志物理文件的尺寸,经过一番寻找,终于找到了解决方法. 查 ...
- CentOS 7 httpd服务的安装、配置
关于linux httpd的搭建和配置都需要基于yum源 1:安装httpd yum linstall httpd -y 2:进入html文件 cd /var/www/html 讲已经编辑的htm ...
- SQL 查询某个表被哪些存储过程使用到
--1.查询某个表被哪些存储过程使用到 : select distinct object_name(id) from syscomments where id in (select object_id ...
- SQL 2000/2005/2008 收缩日志方法
一般情况下,SQL数据库的收缩并不能很大程度上减小数据库大小,其主要作用是收缩日志大小,应当定期进行此操作以免数据库日志过大. 方法一:清空日志.1.设置数据库模式为简单模式:打开SQL企业管理器,在 ...
- 利用 Excel 公式进行数据整理
一个考勤机里导出来的数据明细: A3公式:=IF(MOD(ROW(Sheet1!U5),2)=1,Sheet1!U5,INDIRECT("Sheet1!U"&ROW(She ...
- Visual Studio 2015里面汇编工具Asm Dude的配置!
最近开始学习汇编,也开始使用Visual Studio 2015写汇编程序,比较了半天,最后觉得Asm Dude应该是目前Visual Studio 2015非常好的汇编开发插件了,但是如果默认安装上 ...
- 我的ZJ解题心得
想要学好程序设计第一是要养成你的编程思维,也就是你对编程的一种概念和思维定式,长期的解题会让你产生解题经验进而形成一种思维定式,比如看到一个题目就立即想出这题要用什么方法解题这样.编程思维我认为还包括 ...
- 含大量行的订单创建时候creditlimit校验最耗时间
含大量行的订单创建时候creditlimit校验最耗时间
- python-appium识别元素等待时间
1.显式等待 一个显式等待是你定义的一段代码,用于等待某个条件发生然后再继续执行后续代码. from selenium import webdriverfrom selenium.webdriver. ...
- 转:Connection: close和Connection: keep-alive有什么区别?
原文:http://www.cnblogs.com/TinyMing/p/4597136.html 一.问题现象: 一个JSP页面,居然要耗时40多秒.网页中有大量的图片的CSS问题解决: 原因也找了 ...