RaUI/Source/MyDb/SysFuns/MultiThread.cs
zilinsoft 3262955f2f ### 2023-11-07更新
------
#### RaUIV4    V4.0.2311.0701
- *.[全新]整合了MyDb、ryControls、MyDb_MySQL等dll文件到RaUI一个项目。
- *.[新增]新增ApkOp类,可以轻松获取APK信息。
- *.[新增]新增JsonExt扩展类,让Json操作更简单。
- *.[新增]新增WebP类,可以支持webp格式的图片。
- *.[改进]ryQuickSQL中的AddField方法改为自动替换已存在的同名值。
- *.[修复]ryQuickSQL中的AddFieldCalc方法无法正常计算的BUG。
2023-11-07 16:37:53 +08:00

181 lines
5.5 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading;
namespace ryCommon
{
/// <summary>
///
/// </summary>
public class RyThreadInfo
{
/// <summary>
///
/// </summary>
public int start = 0;
/// <summary>
///
/// </summary>
public int end = 0;
}
/// <summary>
///
/// </summary>
public class MultiThread
{
/// <summary>
/// 设置线程数量
/// </summary>
public int ThreadCount
{
get; set;
} = 20;
/// <summary>
/// 要计算的总数量
/// </summary>
public int CalcCount
{ get; set; }
/// <summary>
/// 每个线程要计算的数量
/// </summary>
public int EveryThreadCalcCount
{
get; set;
}
/// <summary>
///
/// </summary>
public MultiThread()
{ }
private int CompleCount = 0;
private int CompleIndex = 0;
private DateTime startTime;
/// <summary>
/// 当前已使用的时间
/// </summary>
public TimeSpan UseTime
{
get { return (DateTime.Now - startTime); }
}
private static readonly object CompleIndexlocker = new object();
/// <summary>
///
/// </summary>
/// <param name="threadCount">线程数量</param>
/// <param name="calcCount">要计算的事务数量</param>
public MultiThread(int threadCount, int calcCount)
{
ThreadCount = threadCount;
CalcCount = calcCount;
}
private Thread[] _MultiThread;
/// <summary>
///
/// </summary>
public void Start()
{
startTime = DateTime.Now;
int _ThreadCount = ThreadCount;
//线程数量大于地址总数
if (ThreadCount > CalcCount)
{
_ThreadCount = CalcCount;
}
if (_ThreadCount == 0)
{
EveryThreadCalcCount =0;
OnAllCalcComplete?.Invoke(this, UseTime);
return;
}
else
{
EveryThreadCalcCount = (CalcCount / _ThreadCount);
}
System.Net.ServicePointManager.DefaultConnectionLimit = 1024;
if (_MultiThread != null)
{
for (int i = 0; i < _MultiThread.Length; i++)
{
if (_MultiThread[i] != null) { _MultiThread[i].Abort(); }
}
}
CompleIndex = 0;
CompleCount = _ThreadCount;
_MultiThread = new Thread[_ThreadCount];
for (int i = 0; i < _ThreadCount; i++)
{
_MultiThread[i] = new Thread(new ThreadStart(Calc));
ryCommon.Storage tStor = new ryCommon.Storage();
tStor.AddNode2("id", "Info");
tStor.SetAttrValue("start", EveryThreadCalcCount * i);
if (i == _ThreadCount - 1)
{
tStor.SetAttrValue("end", (CalcCount - 1).ToString());
}
else
{
tStor.SetAttrValue("end", ((EveryThreadCalcCount * (i + 1)) - 1).ToString());
}
tStor.SetAttrValue("index", i.ToString());
_MultiThread[i].Name = tStor.GetXMLText();
_MultiThread[i].Start();
}
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public delegate void ThreadHandler(object sender, RyThreadInfo e);
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public delegate void CompleteHandler(object sender, TimeSpan e);
/// <summary>
/// 多线程计算时激发
/// </summary>
[Description("多线程计算时激发")]
public event ThreadHandler OnCalc;
/// <summary>
/// 在所有线程执行完毕后发生
/// </summary>
[Description("在所有线程执行完毕后发生")]
public event CompleteHandler OnAllCalcComplete;
/// <summary>
/// 在线程执行完毕后发生,最后一个执行完毕的线程将不收到本事件通知
/// </summary>
[Description("在线程执行完毕后发生,最后一个执行完毕的线程将不收到本事件通知")]
public event EventHandler OnCalcComplete;
private void Calc()
{
if(OnCalc!=null)
{
RyThreadInfo item = new RyThreadInfo();
ryCommon.Storage tStor = new ryCommon.Storage(Thread.CurrentThread.Name);
tStor.SelectNode2("id", "Info");
item.start = tStor.GetAttrValueByInt("start", 0);
item.end = tStor.GetAttrValueByInt("end", 0);
OnCalc(this, item);
}
lock (CompleIndexlocker)
{
CompleIndex++;
if (CompleIndex == CompleCount)
{
OnAllCalcComplete?.Invoke(this, UseTime);
}
else
{
OnCalcComplete?.Invoke(this, new EventArgs());
}
}
}
}
}