多线程在C#中使用得非常频繁,线程之间的充分利用显得尤为重要,一般的写法都是得不到充分利用资源,本人针对多线程写了一种方法,可以充分利用资源,保证每次同时启动10条线程,现在执行完马上再启动一条,总之线程维持10条。

1. 线程启动方法,使用while死循环,获取需要计算的参数和创建线程。

   while (true)
{
bool isALlSuccess = IsALlSuccess(fundCodes);//判断全部数据有没有执行完
if (isALlSuccess)//所有风控全部走完后则跳出while循环
{
//Log.Log.Debug("个券指令相关性判断完成!");
break;
}
if (ThrowFlag)//多线程执行失败
{
break;
}
//--
string fundcode = GetFund(fundCodes);//获取单个基金
if (fundcode == null) continue;
//--
Thread t = GetThread();//获取线程
if (t == null) continue;
AutoResetEvent are = new AutoResetEvent(false);
InternalThreadInfo tti = new InternalThreadInfo(are, fundcode);
//t.Name = "Thread" + irisk.ToString();
t.Start(tti);//启动线程 //已执行的基金
SetInsIndex();
}

动态创建多线,保存每次都会执行10条线程。

      #region * 获取线程
private List<Thread> Ts = new List<Thread>();//定义线程的集合
private Thread GetThread()
{
Thread td = null;
if (Ts.Count < )
{
td = new Thread(TheeadMod);
Ts.Add(td);
}
else
{
for (int i = ; i < Ts.Count; i++)
{
if (Ts[i] == null)
{
Ts[i] = new Thread(TheeadMod);
td = Ts[i];
break;
}
}
}
return td;
}
#endregion

用于判断多线主要计算的行、数组是否计算完毕。

    #region * 判断多线程是否已经执行完毕
private int successCount = ;//运行成功的行数
/// <summary>
/// 判断多线程是否已经执行完毕
/// </summary>
/// <returns></returns>
private Boolean IsALlSuccess(List<string> fundcodes)
{
if (successCount >= fundcodes.Count)
{
return true;
}
else
{
return false;
}
}
#endregion

获取一条数据,用户传递到多线程里。

     #region * 获取一条单个基金
private int InsIndex = ;
/// <summary>
/// 获取一条风控条目
/// </summary>
/// <returns></returns>
private string GetFund(List<string> fundcodes)
{
if (InsIndex < fundcodes.Count)
{
string str = fundcodes[InsIndex];
return str;
}
else
{
return null;
}
}
#endregion

主要用于计数。

    #region * 自增已执行的基金
/// <summary>
/// 自增已执行的风控条目
/// </summary>
private void SetInsIndex()
{
//lock (insIndexLockObject)
//{
InsIndex++;
//}
}
#endregion #region * 自增线程已执行成功
/// <summary>
/// 自增线程已执行成功
/// </summary>
private void SetSuccessIndex()
{
//lock (successLockObject)
//{
successCount++;
//}
}
#endregion

多线程执行的主要方法,线程执行完后,都会Set掉,并将数据的对于的线程清空。

  #region * 多线程执行的方法
private void TheeadMod(object fundcodes)
{
try
{
InternalThreadInfo tti = fundcodes as InternalThreadInfo;
string fundCode = tti.obj as string;


//--执行的核心代码
//--............................
SetSuccessIndex();//调用计数器 #region * 线程的控制
for (int i = ; i < Ts.Count; i++)
{
Thread t = Ts[i];
if (t != null && t.Name == Thread.CurrentThread.Name)
{
Ts[i] = null;
break;
//t.Join();
}
}
tti.are.Set();
#endregion
}
catch (Exception ex)
{
ThrowFlag = true;
Log.Error("多线程执行出错:" + ex.Message);
//ErrorMsg = ex.Message;
}
}
#endregion

类:InternalThreadInfo用于给多线程传统参数,are主要是多线程执行的状态,obj主要是传递的参数,可以是实体类、string、datarow行。

    internal class InternalThreadInfo
{
public AutoResetEvent are = null;
public object obj = null;
public InternalThreadInfo(AutoResetEvent are, object obj)
{
this.are = are;
this.obj = obj;
}
}

C#之多线程的更多相关文章

  1. Python中的多进程与多线程(一)

    一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...

  2. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  3. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  4. Java多线程

    一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程.   进程:进程 ...

  5. .NET基础拾遗(5)多线程开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  6. Java多线程基础——对象及变量并发访问

    在开发多线程程序时,如果每个多线程处理的事情都不一样,每个线程都互不相关,这样开发的过程就非常轻松.但是很多时候,多线程程序是需要同时访问同一个对象,或者变量的.这样,一个对象同时被多个线程访问,会出 ...

  7. C#多线程之线程池篇3

    在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...

  8. C#多线程之线程池篇2

    在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我 ...

  9. C#多线程之线程池篇1

    在C#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...

  10. C#多线程之线程同步篇3

    在上一篇C#多线程之线程同步篇2中,我们主要学习了AutoResetEvent构造.ManualResetEventSlim构造和CountdownEvent构造,在这一篇中,我们将学习Barrier ...

随机推荐

  1. 永久解决delphi 2010不能2次启动问题

    由于在Windows安装了最近的更新(KB2982791, KB2970228)后,Delphi的IDE需要创建的一个文件%TEMP%\EditorLineEnds.ttr会被系统锁定,导致除非重新启 ...

  2. Linux之Redis-redis哨兵集群详解

    1.Sentinel 哨兵 Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所 ...

  3. error: Error: No resource found for attribute ‘layout_scrollFlags’ in package‘包名’

    遇到error: Error: No resource found for attribute 'layout_scrollFlags' in package'包名' 这个问题时候刚開始自己也是感觉到 ...

  4. 【云安全与同态加密_调研分析(6)】云计算及云安全主流体系架构与模型——By Me

                                                            云计算及云安全的主流体系架构与模型 1. 云计算主流安全参考模型 1.1 云计算安全参考 ...

  5. 前端 javascript 数据类型 字符串

    字符串是由字符组成的数组,但在JavaScript中字符串是不可变的:可以访问字符串任意位置的文本,但是JavaScript并未提供修改已知字符串内容的方法. obj.charAt(n) 返回字符串中 ...

  6. J.U.C Atomic(一)CAS原理

    CAS概念 CAS:Compare And Swap,比较并交换.java.util.concurrent包完全是建立于CAS机制之上的. CAS原理 Java CAS是通过调用Unsafe的nati ...

  7. javaScript动画1 offsetWidth、offsetLeft

    offsetWidth和offsetHeight <!DOCTYPE html> <html lang="en"> <head> <met ...

  8. 『NiFi 学习之路』把握 —— 架构及主要部件

    一.概述 通过前面几篇文章的学习,相信你对 NiFi 有了一个基础性的了解. 数据处理和分发系统 是什么概念? NiFi 系统中数据的传递方式是怎样的? NiFi 的重要 Processor 有哪些? ...

  9. 714. Best Time to Buy and Sell Stock with Transaction Fee

    问题 给定一个数组,第i个元素表示第i天股票的价格,可执行多次"买一次卖一次",每次执行完(卖出后)需要小费,求最大利润 Input: prices = [1, 3, 2, 8, ...

  10. Spring MVC 复习笔记03

    1. @RequestMapping 1). url映射 定义controller方法对应的url,进行处理器映射使用. 2). 窄化请求映射  3). 限制http请求方法 出于安全性考虑,对htt ...