C#基础系列:多线程的常见用法详解
作者:网络转载 发布时间:[ 2016/3/3 11:25:53 ] 推荐标签:.NET 测试开发技术 线程
转到定义可知参数有两类,一类是无参无返回值的委托,另一类是有参无返回值的委托。对于有参数的委托使用方法:
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);
}
}
对于有参又有返回值的委托,很显然使用new Thread()这种方式是没有解决方案的。其实对于有参又有返回值的委托可以使用异步来实现:
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();//主线程阻塞,等待分支线程运行结束,这一步看功能需求进行选择,主要为了多个进程达到同步的效果
②线程的优先级可以通过Thread对象的Priority属性来设置,Priority属性对应一个枚举:
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,
}
从0到4,优先级由低到高。
③关于多个线程同时使用一个对象或资源的情况,也是线程的资源共享,为了避免数据紊乱,一般采用.Net悲观锁lock的方式处理。
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);
}
}
}
(2)Task方式使用多线程:这种方式一般用在需要循环处理某项业务并且需要得到处理后的结果。使用代码如下:
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());
//等待所有线程只都行完毕
使用这种方式的时候需要注意这一句 var bdTmp = bd;这里必须要用一个临时变量,要不然多个bd对象容易串数据。如果有兴趣可以调试看看。这种方法比较简单,不多说了。当然Task对象的用法肯定远不止如此,还涉及到任务的调度等复杂的逻辑。博主对这些东西理解有限,不讲解了。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11热门文章
常见的移动App Bug??崩溃的测试用例设计如何用Jmeter做压力测试QC使用说明APP压力测试入门教程移动app测试中的主要问题jenkins+testng+ant+webdriver持续集成测试使用JMeter进行HTTP负载测试Selenium 2.0 WebDriver 使用指南