熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

實例講解.NET多線程執行函數

2013-11-13 10:02:21  來源: .NET編程 

  這裡為什麼會出現多線程?原因是DebugLZQ在寫一個LINQ綜合Demo的時候遇到了多線程便停下手來整理一下關於多線程的文章園子裡很多很多因此關於多線程理論性的東西LZ就不去多說了這篇博文主要是用最簡單的例子總結下多線程調用函數的相關注意點重點偏向應用和記憶

  多線程調用無參函數

  using System;

  using SystemCollectionsGeneric;

  using SystemLinq;

  using SystemText;

  using SystemThreading;

  namespace 多線程 {

  class Program

  {

  static void Main(string[] args)

  {

  ConsoleWriteLine(主線程開始);

  Thread t = new Thread(new ThreadStart(ShowTime));//注意ThreadStart委托的定義形式

  tStart();//線程開始控制權返回Main線程

  ConsoleWriteLine(主線程繼續執行);

  //while (tIsAlive == true) ;

  ThreadSleep();

  tAbort();

  tJoin();//阻塞Main線程直到t終止

  ConsoleWriteLine();

  ConsoleReadKey();

  }

  static void ShowTime()

  {

  while (true)

  {

  ConsoleWriteLine(DateTimeNowToString());

  }

  }

  }

  }

  注意ThreadStart委托的定義如下:

  

  可見其對傳遞進來的函數要求是:返回值void無參數

  多線程調用帶參函數(兩種方法)

  using System;

  using SystemCollectionsGeneric;

  using SystemLinq;

  using SystemText;

  using SystemThreading;

  namespace 多線程_帶參數 {

  class Program

  {

  static void Main(string[] args)

  {

  ConsoleWriteLine(Main線程開始);

  Thread t = new Thread(new ParameterizedThreadStart(DoSomething));//注意ParameterizedThreadStart委托的定義形式

  tStart(new string[]{HelloWorld});

  ConsoleWriteLine(Main線程繼續執行);

  ThreadSleep();

  tAbort();

  tJoin();//阻塞Main線程直到t終止

  ConsoleReadKey();

  }

  static void DoSomething(object  s)

  {

  string[] strs = s as string[];

  while (true)

  {

  ConsoleWriteLine({}{}strs[]strs[]);

  }

  }

  }

  }

  注意ParameterizedThreadStart委托的定義如下:

  

  可見其對傳入函數的要求是:返回值void參數個數參數類型object

  using System;

  using SystemCollectionsGeneric; u

  sing SystemLinq;

  using SystemText;

  using SystemThreading;

  namespace 多線程_帶參數 {

  class Program

  {

  static void Main(string[] args)

  {

  Guest guest = new Guest()

  {

  Name=Hello Age=

  };

  Thread t = new Thread(new ThreadStart(guestDoSomething));//注意ThreadStart委托的定義形式

  tStart();

  ThreadSleep();

  tAbort();

  tJoin();//阻塞Main線程直到t終止

  ConsoleReadKey();

  }

  }

  //

  class Guest

  {

  public string Name { get; set; }

  public int Age { get; set; }

  public void DoSomething()

  {

  while (true)

  {

  ConsoleWriteLine({}{} Name Age);

  }

  }

  }

  }

  這個還是使用ThreadStart委托對方法進行了一個封裝

  兩種方法可隨意選擇第一種貌似簡潔一點

  線程同步

  線程同步的方法有很多很多種volatileLockInterLockMonitorMutexReadWriteLock

  這裡用lock說明問題:在哪裡同步用什麼同步同步誰?

  首先感受下不同步會出現的問題:

  

  代碼就是下面的代碼去掉lock塊

  using System;

  using SystemCollectionsGeneric;

  using SystemLinq;

  using SystemText;

  using SystemThreading;

  namespace 多線程_同步 {

  class Program

  {

  static object obj = new object();//同步用

  static int balance = ;

  static void Main(string[] args)

  {

  Thread t = new Thread(new ThreadStart(Credit));

  tStart();

  Thread t = new Thread(new ThreadStart(Debit));

  tStart();

  ConsoleReadKey();

  }

  static void Credit()

  {

  for (int i = ; i < ; i++)

  {

  lock (obj)

  {

  balance += ;

  ConsoleWriteLine(After creditingbalance is {} balance);

  }

  }

  }

  static void Debit()

  {

  for (int i = ; i < ; i++)

  {

  lock (obj)

  {

  balance = ;

  ConsoleWriteLine(After debitingbalance is {} balance);

  }

  }

  }

  }

  }

  小結:多線程調用函數就是這樣在Winform中控件綁定到特定的線程從另一個線程更新控件不應該直接調用該控件的成員這個非常有用


From:http://tw.wingwit.com/Article/program/net/201311/12352.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.