最近想在使用.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中使用多线程及队列,异步处理一个耗时的任务(原创)的更多相关文章

  1. 如何在ASP.Net中实现RSA加密

    在我们实际运用中,加密是保证数据安全的重要手段.以前使用ASP时,对数据加密可以使用MD5和SHA1算法,这两种算法虽然快捷有效,但是无法对通过它们加密的密文进行反运算,即是解密.因此需要解密数据的场 ...

  2. 如何在ASP.NET Core程序启动时运行异步任务(3)

    原文:Running async tasks on app startup in ASP.NET Core (Part 3) 作者:Andrew Lock 译者:Lamond Lu 之前我写了两篇有关 ...

  3. 示例 - 如何在ASP.NET中应用Spider Studio生成的DLL?

    >> 接前文 "示例 - 如何在Console应用程序中应用SpiderStudio生成的DLL?", 将其运用到ASP.NET中: 1. 创建WebApplicati ...

  4. (译)如何在ASP.NET中安全使用ViewState

    原文:http://www.codeproject.com/Articles/150688/How-to-make-ViewState-secure-in-ASP-NET 介绍 ASP.NET中的Vi ...

  5. 如何在ASP.NET Core程序启动时运行异步任务(2)

    原文:Running async tasks on app startup in ASP.NET Core (Part 2) 作者:Andrew Lock 译者:Lamond Lu 在我的上一篇博客中 ...

  6. 如何在ASP.NET Core程序启动时运行异步任务(1)

    原文:Running async tasks on app startup in ASP.NET Core (Part 1) 作者:Andrew Lock 译者:Lamond Lu 背景 当我们做项目 ...

  7. 如何在asp.net中获取GridView隐藏列的值?

    在阅读本文之前,我获取gridview某行某列的值一般做法是这样的:row.Cells[3].Text.ToString().有点傻瓜呵呵 在Asp.net 2.0中增加了一个新的数据绑定控件:Gri ...

  8. 如何在Asp.net中备份Access数据库?

    public   void   Create(   string   mdbPath   ) { if(   File.Exists(mdbPath)   )   //检查数据库是否已存在 { thr ...

  9. 如何在Asp.Net中使用JQueryEasyUI

    JQueryEasyUI的基本信息: 官方下载 官方演示 官方文档 一.jQuery easyUI下载后解压的文件目录如下图: demo:JQueryEasyUI的一些示例页面,在项目使用可以将该目录 ...

随机推荐

  1. 文件hash数据库

    unit YxdDB; interface uses Windows, Classes, SysUtils, SyncObjs; type TYXDDBValue = packed record Si ...

  2. WebApi:自定义筛选器

    最近在项目中有这样一个需求,记录每次Api访问的调用时间,运行时间,传入数据,返回数据等信息. 第一反应就是添加一个类,用来实现相应的功能,然后在方法的代码中添加,但是这样的话,需要修改所有的方法的代 ...

  3. 使用C#访问SQLLite

    1.SQLLite如何集成在C#中 2.相关C#与SQLLite资源,及说明 3.简单示例

  4. 外联css及js的使用

    结构图如下: html如下: <!DOCTYPE html> <html> <head> <title>button test</title> ...

  5. IntelliJ IDEA使用记录

    一.快捷键 1. 生成main方法 在编写代码的时候直接输入psv就会看到一个psvm的提示,此时点击tab键一个main方法就写好了. psvm 也就是public static void main ...

  6. javaSwing文本域文件

    public class JTextAreaTest extends JFrame{    public JTextAreaTest()    {            setSize(200, 40 ...

  7. 标清与高清,720p和1080p,720i和720p,h264与h265

    480x320, 640x480 标清 1024x720p 高清 1920x1080i (隔行扫描) 也属于高清 1920x1080p 全高清 3840x2160,7680x4320 超(高)清   ...

  8. 纸上谈兵:队列(queue)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 队列(queue)是一个简单而常见的数据结构.队列也是有序的元素集合.队列最大的特 ...

  9. 2016-08-16: copy-and-swap

    #include <algorithm> // std::copy #include <cstddef> // std::size_t #include <stdio.h ...

  10. phpexcel导入excel表格

    html代码 <form action="{:U('Mall/updExcel')}" method="POST" enctype="multi ...