• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#使用队列(Queue)解决简单的并发问题

C#使用队列(Queue)解决简单的并发问题

作者:天空依然蔚蓝 字体:[增加 减小] 来源:互联网 时间:2017-05-28

天空依然蔚蓝 通过本文主要向大家介绍了c语言,欲情 c max,维生素c,奔驰c200,85度c等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

本文通过实例,更具体的讲解了队列,队列(Queue)代表了一个先进先出的对象集合。当您需要对各项进行先进先出的访问时,则使用队列。当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队。

有一个场景:一个抢购的项目,假设有5件商品,谁先抢到谁可以买,但是如果此时此刻(这里的此时此刻假设是相同的时间),有100人去抢这个商品,如果使用平时的方法会出现什么情况呢?你懂的,这里所说是就是有关并发的问题。

平时我们去超市购物去结账的时候就是排队,这里我们先让抢购人排好队,按时间,谁先点击的抢购按钮谁就排在前面,这样就形成了一个队列,然后我们再对这个队列处理,这样就不会出现并发的问题了。(至少可以处理这样简单的并发,这里不讨论太复杂的并发)

案例:

要求:有一个发布文章的接口,每发布一篇文章,调用一下接口。(这里不用批量发布,为了讲解这个)

建立一个这样的处理程序类,BusinessInfoHelper.cs

 

namespace MyNameSpace  
 
{ 
  //队列临时类 
  public class QueueInfo 
  { 
    public string medias { get; set; } 
    public string proids { get; set; } 
    public string host { get; set; } 
    public string userid { get; set; } 
    public string feedid { get; set; } 
  } 
 
  public class BusinessInfoHelper 
  { 
    #region 解决发布时含有优质媒体时,前台页面卡住的现象 
    //原理:利用生产者消费者模式进行入列出列操作 
 
    public readonly static BusinessInfoHelper Instance = new BusinessInfoHelper(); 
    private BusinessInfoHelper() 
    { } 
 
    private Queue<QueueInfo> ListQueue = new Queue<QueueInfo>(); 
 
    public void AddQueue(string medias, string proids, string host, string userid, string feedid) //入列 
    { 
      QueueInfo queueinfo = new QueueInfo(); 
 
      queueinfo.medias = medias; 
      queueinfo.proids = proids; 
      queueinfo.host = host; 
      queueinfo.userid = userid; 
      queueinfo.feedid = feedid; 
      ListQueue.Enqueue(queueinfo); 
    } 
 
    public void Start()//启动 
    { 
      Thread thread = new Thread(threadStart); 
      thread.IsBackground = true; 
      thread.Start(); 
    } 
 
    private void threadStart() 
    { 
      while (true) 
      { 
        if (ListQueue.Count > 0) 
        { 
          try 
          { 
            ScanQueue(); 
          } 
          catch (Exception ex) 
          { 
            LO_LogInfo.WLlog(ex.ToString()); 
          } 
        } 
        else 
        { 
          //没有任务,休息3秒钟 
          Thread.Sleep(3000); 
        } 
      } 
    } 
 
    //要执行的方法 
    private void ScanQueue() 
    { 
      while (ListQueue.Count > 0) 
      { 
        try 
        { 
          //从队列中取出 
          QueueInfo queueinfo = ListQueue.Dequeue(); 
 
          //取出的queueinfo就可以用了,里面有你要的东西 
          //以下就是处理程序了 
          //。。。。。。 
 
        } 
        catch (Exception ex) 
        { 
          throw; 
        } 
      } 
    } 
 
 
    #endregion 
  } 
} 
 

</div>

以上页面写好后,在程序开始运行时就得启动这个线程去不停的处理任务,那么我们在Global的Application_Start里可以这样写:

//启动发布优质媒体程序 
MyNameSpace.BusinessInfoHelper.Instance.Start(); 

有一个问题出来了,如果我处理完队列中的一条记录后,想返回这条记录的ID,这个程序好像不能完成,我就使用了另一个方法 Lock方法 ,把方法锁定,具体的如下,

在页面中定义全局的锁:

private static object lockObject= new Object(); 
 
在方法中这样调用:

lock(lockObject) 
 
{ 
 
//........ 
 
} 

以上是本文的全部内容,希望对大家进一步学习队列有所帮助

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 详解C#中三个关键字params,Ref,out
  • 浅谈C#中的for循环与foreach循环
  • 关于C#中ajax跨域访问问题
  • 使用C#编写15子游戏
  • 为IObservable实现自己的运算符(详解)
  • 使用C#正则表达式获取必应每日图片地址
  • C#七大经典排序算法系列(上)
  • C#无损压缩图片
  • C# BackgroundWorker用法详解
  • 详解三种C#实现数组反转方式

相关文章

  • 2017-05-28C#检测DataSet是否为空的方法
  • 2017-05-28C#文件断点续传实现方法
  • 2017-05-28C#实现简单的Http请求实例
  • 2017-05-28C/C++ 传递动态内存的深入理解
  • 2017-05-28C# datatable 不能通过已删除的行访问该行的信息处理方法
  • 2017-05-28c#开发的程序安装时动态指定windows服务名称
  • 2017-05-28C#实现的MD5加密功能与用法示例
  • 2017-05-28C#窗体全屏功能实例代码
  • 2017-05-28c++与c#的时间转换示例分享
  • 2017-05-28C#编程中设置程序只可被运行一次的方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#获取目录最后访问时间的方法
    • C#交错数组用法实例
    • 深入C# winform清除由GDI绘制出来的所有线条或图形的解决方法
    • 基于C#的UDP协议的同步通信实现代码
    • C#中DataGridView常用操作实例小结
    • 基于C#生成随机数示例
    • treeview递归绑定的两种方法
    • C#实现窗口之间的传值
    • C#中将ListView中数据导出到Excel的实例方法
    • 将DataTable转换成List&lt;T&gt;实现思路及示例代码

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有