public delegate void ThreadStart();
static void Main(string[] args)
{
Thread oGetArgThread = new Thread(new ThreadStart(Test));
oGetArgThread.IsBackground = true;
oGetArgThread.Start();
for (var i = 0; i < 1000000; i++)
{
Console.WriteLine("主线程计数" + i);
//Thread.Sleep(100);
}
}
private static void Test()
{
for (var i = 0; i < 1000000; i++)
{
Console.WriteLine("后台线程计数" + i);
//Thread.Sleep(100);
}
}
定义一个没有参数没有返回值的方法传入该委托。当然也可以不定义方法写成匿名方法:
static void Main(string[] args)
{
Thread oGetArgThread = new Thread(new System.Threading.ThreadStart(() =>
{
for (var i = 0; i < 1000000; i++)
{
Console.WriteLine("后台线程计数" + i);
//Thread.Sleep(100);
}
}));
oGetArgThread.IsBackground = true;
oGetArgThread.Start();
public Thread(ParameterizedThreadStart start);
public Thread(ThreadStart start);
public Thread(ParameterizedThreadStart start, int maxStackSize);
public Thread(ThreadStart start, int maxStackSize);
static void Main(string[] args)
{
Thread oThread = new Thread(new ParameterizedThreadStart(Test2));
oThread.IsBackground = true;
oThread.Start(1000);
}
private static void Test2(object Count)
{
for (var i = 0; i < (int)Count; i++)
{
Console.WriteLine("后台线程计数" + i);
//Thread.Sleep(100);
}
}
public delegate string MethodCaller(string name);//定义个代理
MethodCaller mc = new MethodCaller(GetName);
string name = "my name";//输入参数
IAsyncResult result = mc.BeginInvoke(name,null, null);
string myname = mc.EndInvoke(result);//用于接收返回值
public string GetName(string name) // 函数
{
return name;
}
Thread oGetArgThread = new Thread(new ThreadStart(Test)); oGetArgThread.Join();//主线程阻塞,等待分支线程运行结束,这一步看功能需求进行选择,主要为了多个进程达到同步的效果
public enum ThreadPriority
{
// 摘要:
// 可以将 System.Threading.Thread 安排在具有任何其他优先级的线程之后。
Lowest = 0,
//
// 摘要:
// 可以将 System.Threading.Thread 安排在具有 Normal 优先级的线程之后,在具有 Lowest 优先级的线程之前。
BelowNormal = 1,
//
// 摘要:
// 可以将 System.Threading.Thread 安排在具有 AboveNormal 优先级的线程之后,在具有 BelowNormal 优先级的线程之前。
// 默认情况下,线程具有 Normal 优先级。
Normal = 2,
//
// 摘要:
// 可以将 System.Threading.Thread 安排在具有 Highest 优先级的线程之后,在具有 Normal 优先级的线程之前。
AboveNormal = 3,
//
// 摘要:
// 可以将 System.Threading.Thread 安排在具有任何其他优先级的线程之前。
Highest = 4,
}
private static object oLock = new object();
private static void Test2(object Count)
{
lock (oLock)
{
for (var i = 0; i < (int)Count; i++)
{
Console.WriteLine("后台线程计数" + i);
//Thread.Sleep(100);
}
}
}
List<Task> lstTaskBD = new List<Task>();
foreach (var bd in lstBoards)
{
var bdTmp = bd;//这里必须要用一个临时变量
var oTask = Task.Factory.StartNew(() =>
{
var strCpBdCmd = "rm -Rf " + bdTmp.Path + "/*;cp -R " + CombineFTPPaths(FTP_EMULATION_BD_ROOT,
"bd_correct") + "/* " + bdTmp.Path + "/";
oPlink.Run(bdTmp.EmulationServer.BigIP, bdTmp.EmulationServer.UserName, bdTmp.EmulationServer.Password,
strCpBdCmd);
Thread.Sleep(500);
});
lstTaskBD.Add(oTask);
}
Task.WaitAll(lstTaskBD.ToArray());//等待所有线程只都行完毕
public class CSpiderCtrl
{
//将线程池对象作为一个全局变量
static Semaphore semaphore;
public static void Run()
{
//1. 创建 SuperLCBB客户端对象
var oClient = new ServiceReference_SuperLCBB.SOAServiceClient();
//2.初始化的时候new最大的线程池个数255(这个数值根据实际情况来判断,如果服务器上面的东西很少,则可以设置大点)
semaphore = new Semaphore(250, 255);
CLogService.Instance.Debug("又一轮定时采集...");
_TestBedGo(oClient);
}
//执行多线程的方法
private static void _TestBedGo(ServiceReference_SuperLCBB.SOAServiceClient oClient)
{
List<string> lstExceptPDUs = new List<string>(){
"SUPERLABEXP"
};
var oTestBedRes = oClient.GetTestBedExceptSomePDU(lstExceptPDUs.ToArray(), true);
if (CKVRes.ERRCODE_SUCCESS != oTestBedRes.ErrCode)
{
CLogService.Instance.Error("xxx");
return;
}
var lstTestBed = oTestBedRes.ToDocumentsEx();
System.Threading.Tasks.Parallel.ForEach(lstTestBed, (oTestBed) =>
{
//一次最多255个线程,超过255的必须等待线程池释放一个线程出来才行
semaphore.WaitOne();
//CLogService.Instance.Info("开始采集测试床:" + oTestBed[TBLTestBed.PROP_NAME]);
//Thread.Sleep(2000);
var strTestBedName = oTestBed[TBLTestBed.PROP_NAME] as string;
var strSuperDevIP = oTestBed[TBLTestBed.PROP_SUPERDEVIP] as string;
var strTestBedGID = oTestBed[TBLTestBed.PROP_GID] as string;
var strPdu = oTestBed[TBLTestBed.PROP_PDUGID] as string;
Thread.Sleep(new Random().Next(1000, 5000));
var oGetRootDevicesByTestBedGIDRes = oClient.GetRootDevicesByTestBedGID(strTestBedGID);
CLogService.Instance.Debug(strPdu + "——测试床Name:" + strTestBedName + "开始");
Stopwatch sp = new Stopwatch();
sp.Start();
if (oGetRootDevicesByTestBedGIDRes.ErrCode != CKVRes.ERRCODE_SUCCESS || oGetRootDevicesByTestBedGIDRes.Documents.Count < 2)
{
CLogService.Instance.Debug("shit -- 3实验室中测试床Name:" + strTestBedName + "2完成异常0");
//这里很重要的一点,每一次return 前一定要记得释放线程,否则这个一直会占用资源
semaphore.Release();
return;
}
var strXML = oGetRootDevicesByTestBedGIDRes.Documents[0];
var strExeName = oGetRootDevicesByTestBedGIDRes.Documents[1];
//var strExeName = "RateSpider";
var oSuperDevClient = new SuperDevClient(CSuperDev.ENDPOINT, string.Format(CSuperDev.SuperDevURL, strSuperDevIP));
try
{
oSuperDevClient.IsOK();
}
catch (Exception)
{
CLogService.Instance.Error("测试床Name:" + strTestBedName + "异常,插件没起");
semaphore.Release();
return;
}
//2.3.1.请求SuperDev.Server(SuperDevIP),发送Run(XML和Exename)
var oRunExeRes = new CKVRes();
try
{
oRunExeRes = oSuperDevClient.RunExeEx(strExeName, false, new string[] { strXML });
}
catch
{
//CLogService.Instance.Debug("测试床Name:" + strTestBedName + "异常:" + ex.Message);
}
sp.Stop();
CLogService.Instance.Debug(strPdu + "——测试床Name:" + strTestBedName + "完成时间" + sp.Elapsed);
//每一个线程完毕后记得释放资源
semaphore.Release();
});
}
}
foreach(var oTestbed in lstTestBed)
{
Thread oThread=new Thread(new ThreadStart({ ...}));
}
public static void SpinUntil(Func<bool> condition);
public static bool SpinUntil(Func<bool> condition, int millisecondsTimeout);
public static bool SpinUntil(Func<bool> condition, TimeSpan timeout);
SpinWait.SpinUntil(() =>
{
bIsworking = m_oClient.isworking(new isworking()).result;
return bIsworking == false;
}, 600000);
//如果等了10分钟还在跳纤则跳出
if (bIsworking)
{
oRes.ErrCode = "false交换机跳纤时间超过10分钟,请检查异常再操作";
return oRes;
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有