多线程在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. chrome 因js死循环卡住

    chrome因js死循环卡住的解决方法: top命令查看chrome的pid kill -9 pid 杀死整个chrome进程(所有网页都关闭)

  2. alexnet,VGG,googlenet,resnet

    非常好的一篇:https://my.oschina.net/u/876354/blog/1637819 alexnet和VGG没什么特别的,VGG深一些. Deep learning 实际上是一种 f ...

  3. Incorrect string value: '\xF0\x9F\x98\x84\xF0\x9F 表情插入mysql 报错

    导致报错的问题是 emoji表情是4位 mysql 5.5.3版本以下数据库(utf8格式为3位),不支持.需要更新mysql5.5.3及以上的版本数据库并设置默认或者表或者字段的格式为 utf8mb ...

  4. oracle入门(8)——实战:支持可变长参数、多种条件、多个参数排序、分页的存储过程查询组件

    [本文介绍] 学了好几天,由于项目需要,忙活了两天,写出了个小组件,不过现在还只能支持单表操作.也没考虑算法上的优化,查询速度要比hibernate只快了一点点,可能是不涉及多表查询的缘故吧,多表的情 ...

  5. 【开发者笔记】冒泡排序过程呈现之java内置GUI表示

    自己玩玩写写,排序的过程多么有趣,特别是把看着电脑吧一堆乱七八糟的数据排成有序组合的时候,看起来贼舒服,特别是强迫症患者.好了,话不多说上代码,也算是自己记录一下吧,没有什么技术含量但个人感觉比较有趣 ...

  6. BigData Technique&&Application指南-笔记1

    1.数据的量级 传统企业数据量基本上在TB之上,大型互联网企业达到了PB以上. 2.大量不同的数据类型  结构化数据:是存储在数据库里,可以用二维表来逻辑表达数据.  半结构的非结构化数据:一般都是纯 ...

  7. ActiveMQ简单入门

    一.创建一个简单的Hello World案例 首先需要导入activemq-all-5.14.5.jar包,写生产端: package com.ietree.mq.helloworld; import ...

  8. quick cocos2d-x 下载地址

    https://github.com/chukong/quick-cocos2d-x/tree/master http://www.cocos2dx.net/post/280 配置说明 http:// ...

  9. android 自定义View 对话框

    package com.example.dialog5; import android.os.Bundle;import android.app.Activity;import android.app ...

  10. [C语言](*p)++ 与 *p++ 与 ++*p 拨开一团迷雾

    环境:win7 IDE:DEV-C++ 编译器:GCC 1.先说++i和i++的基础 代码如下: #include <stdio.h> //just change simple void ...