转到定义可知参数有两类,一类是无参无返回值的委托,另一类是有参无返回值的委托。对于有参数的委托使用方法:
  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对象的用法肯定远不止如此,还涉及到任务的调度等复杂的逻辑。博主对这些东西理解有限,不讲解了。