亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#傳遞參數到線程的方法匯總

2020-01-24 02:33:55
字體:
來源:轉載
供稿:網友

本文匯總整理了傳遞參數到線程的方法供大家參考,非常實用,具體內容如下:

首先我們要知道什么是線程,什么時候要用到線程,如何去使用線程,如何更好的利用線程來完成工作。

線程是程序可執行片段的最小單元,是組成運行時程序的基本單元,一個進程有至少一個線程組成。一般在并行處理等待事件的時候要用到線程,如等待網絡響應,等待I/O通訊,后臺事務處理等情況。使用線程其實很簡單,在.net框架下面你首先要定義一個函數來完成一些工作,然后實例化一個線程對象Thread thrd = new Thread(new ThreadStart(線程函數)); 其中ThreadStart是一個不帶參數的函數委托。最后使用thrd.Start()就可以啟動線程了。當然這只是一個很簡單的例子,實際中使用線程會有很多的問題要解決,比如傳遞參數到線程中,等待線程返回,如何同步線程進行同一資源訪問,如何防止死鎖和競爭條件,如何有效的利用線程池,如何提供線程效率等問題。本文在這里將只對傳遞參數到線程進行探討。

在上面舉例中我們看到線程實例化的參數是一個不帶任何參數的函數委托,那么就證明了我們不可能通過這樣一個委托傳遞參數到線程內部。那么我們該怎么做呢?

就我目前所知有三種方法可以實現:1. 利用線程實現類,將調用參數定義成屬性的方式來操作線程參數;2. 利用ParameterizedThreadStart委托來傳遞輸入參數;3. 利用線程池來實現參數傳入。

下面分別加以敘述:

1. 創建線程實現類,這種方式有個最大的優點就是可以通過線程返回多個返回值
假設存在在一個打印功能的線程,通過主函數傳入打印的行,列和字符數據,并返回打印的字符總數。

具體代碼如下:

class ThreadOutput{int _rowCount = 0;int _colCount = 0;char _char = '*';int _ret = 0;/**//// <summary>/// 輸入參數 /// </summary>public int RowCount{ set { _rowCount = value; }}public int ColCount{ set { _colCount = value; }}public char Character{ set { _char = value; }}/**//// <summary>/// 輸出參數 /// </summary>public int RetVal{ get { return _ret; }}public void Output(){ for (int row = 0; row < _rowCount; row++) { for (int col = 0; col < _colCount; col++) {  Console.Write("{0} ", _char);  _ret++; } Console.Write("/n"); }}ThreadOutput to1 = new ThreadOutput();to1.RowCount = 10;to1.ColCount = 20;Thread thrd = new Thread(new ThreadStart(to1.Output));// 設置為后臺線程,主要是為不影響主線程的結束thrd.IsBackground = true;thrd.Start();

最后要注意的是由于線程實現類是通過屬性來傳遞數值的,那么在屬性訪問器中要進行線程同步,否則取得的值可能不正確。

2. 利用ParameterizedThreadStart委托來傳遞輸入參數

ParameterizedThreadStart委托是.Net2.0中才有的。該委托提供來在啟動線程時傳遞一個object參數到線程中。這種方式使用起來比較簡單,但是由于需要對object對象進行類型轉換,所以存在類型不一致的隱患。

3. 利用線程池來實現參數傳入

什么是線程池,線程池是系統提供一個存放線程的容器,進入線程池后的線程控制權由系統掌握。利用線程池的好處是我們無需為線程存在大量空閑時間而去思考干點別的什么,適合于常規性的事務處理。在.Net中線程池是一個static類,所以我們需要通過ThreadPool來調用相關的函數。其中向線程池中加入線程的函數就是ThreadPool.QueueUserWorkItem(new WaitCallBack(), object obj)。這個函數有個WaitCallBack的委托,[ComVisibleAttribute(true)]
public delegate void WaitCallback(Object state)

通過這個委托我們也可以傳遞參數到線程中。

其實還有一種方法可以傳遞參數到線程中,那就是通過回調函數來實現,只不過這種方法本質上和第一種通過類的數據成員來傳遞參數的機制一樣。所以就不再細說來!

具體的實現可以參考下面的源代碼:

全部源代碼如下:(該程序在vs 2005編譯通過)

using System;using System.Collections.Generic;using System.Text;using System.Threading;namespace UsingThread{ struct RowCol {  public int row;  public int col; }; class ThreadOutput {  // 建立等待時間  static public ManualResetEvent prompt = new ManualResetEvent(false);  int _rowCount = 0;  int _colCount = 0;  char _char = '*';  int _ret = 0;  /**//// <summary>  /// 輸入參數  /// </summary>  public int RowCount  {   set { _rowCount = value; }  }  public int ColCount  {   set { _colCount = value; }  }  public char Character  {   set { _char = value; }  }  /**//// <summary>  /// 輸出參數  /// </summary>  public int RetVal  {   get { return _ret; }  }  public void Output()  {   for (int row = 0; row < _rowCount; row++)   {    for (int col = 0; col < _colCount; col++)    {     Console.Write("{0} ", _char);     _ret++;    }    Console.Write("/n");   }   // 激活事件   prompt.Set();  }  public void Output(Object rc)  {   RowCol rowCol = (RowCol)rc;   for (int i = 0; i < rowCol.row; i++)   {    for (int j = 0; j < rowCol.col; j++)     Console.Write("{0} ", _char);    Console.Write("/n");   }  } } class Program {  static void Main(string[] args)  {   ThreadOutput to1 = new ThreadOutput();   to1.RowCount = 10;   to1.ColCount = 20;   Thread thrd = new Thread(new ThreadStart(to1.Output));   // 設置為后臺線程,主要是為不影響主線程的結束   thrd.IsBackground = true;   thrd.Start();   // 建立事件等待   ThreadOutput.prompt.WaitOne();   Console.WriteLine("{0}", to1.RetVal);   ThreadOutput to2 = new ThreadOutput();   to2.RowCount = 5;   to2.ColCount = 18;   to2.Character = '^';   Thread thrds = new Thread(new ThreadStart(to2.Output));   thrds.IsBackground = true;   thrds.Start();   thrds.Join();   Console.WriteLine("{0}", to2.RetVal);   // 傳遞參數給線程的另一種實現   RowCol rc = new RowCol();   rc.row = 12;   rc.col = 13;   to1.Character = '@';   if (ThreadPool.QueueUserWorkItem(new WaitCallback(to1.Output), rc))    Console.WriteLine("Insert Pool is success!");   else    Console.WriteLine("Insert Pool is failed!");   Thread.Sleep(1000);   // 使用新的ThreadStart委托來傳遞參數   rc.col = 19;   to2.Character = '#';   Thread thrdt = new Thread(new ParameterizedThreadStart(to2.Output));   thrdt.Start(rc);   thrdt.Join();  } }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲第一视频在线观看| 黑人狂躁日本妞一区二区三区| 国产精品27p| 日韩精品在线免费播放| 欧美亚洲国产视频| 性欧美xxxx交| 午夜精品三级视频福利| 久久久免费高清电视剧观看| 91亚洲精华国产精华| 中文字幕亚洲欧美日韩在线不卡| 久久久久久噜噜噜久久久精品| 国产精品一区专区欧美日韩| 精品人伦一区二区三区蜜桃网站| 欧美疯狂xxxx大交乱88av| 国产精品成人播放| 亚洲天堂av网| 欧美日韩在线观看视频| 久久久亚洲成人| 日本久久久久久久久久久| 久久精品国产v日韩v亚洲| 欧美超级免费视 在线| 亚洲国产精品一区二区久| 亚洲欧美一区二区三区情侣bbw| 亚洲精品一二区| 欧美日韩国产成人高清视频| 亚洲少妇激情视频| 亚洲精品综合精品自拍| 欧美成人一二三| 黑人巨大精品欧美一区免费视频| 久久精品夜夜夜夜夜久久| 亚洲免费成人av电影| 欧美精品videos另类日本| 九九精品在线播放| 色哟哟亚洲精品一区二区| 丰满岳妇乱一区二区三区| 久久天天躁夜夜躁狠狠躁2022| 亚洲人成在线一二| 91福利视频网| 精品久久久国产| 亚洲欧美一区二区三区久久| 国产一区玩具在线观看| 亚洲精品中文字| 亚洲视频在线免费观看| 国产91热爆ts人妖在线| 色偷偷偷综合中文字幕;dd| 日韩成人xxxx| 国产97在线播放| 96精品久久久久中文字幕| 久久精品久久久久电影| 欧美最猛性xxxxx(亚洲精品)| 国产精品人成电影在线观看| 成人免费观看49www在线观看| 国产亚洲精品久久久久动| 成人激情免费在线| 成人午夜黄色影院| 国产精品一区二区性色av| 日韩中文在线观看| 国产精品爽黄69天堂a| 美女啪啪无遮挡免费久久网站| www.日韩系列| 中文字幕亚洲一区二区三区五十路| 国产在线精品成人一区二区三区| 欧美激情在线狂野欧美精品| 国产精品第1页| 国产亚洲一级高清| 国产mv免费观看入口亚洲| 欧美亚洲伦理www| 日韩经典中文字幕在线观看| 日本精品性网站在线观看| 国产成人亚洲综合91| 国产日韩精品在线观看| 国产91久久婷婷一区二区| 神马久久桃色视频| 国产精品海角社区在线观看| 国语自产精品视频在线看抢先版图片| 97在线视频一区| 国产精品h片在线播放| 岛国av一区二区在线在线观看| 成人免费高清完整版在线观看| 这里只有视频精品| 亚洲激情久久久| 久久久亚洲成人| 自拍偷拍亚洲欧美| 日韩精品极品在线观看| 一区二区三区回区在观看免费视频| 91高潮在线观看| 日韩欧美在线观看| 精品在线小视频| 久久久亚洲天堂| 成人两性免费视频| 国产成人精品最新| 日韩高清中文字幕| 国产日韩中文在线| 亚洲精品在线看| 亚洲午夜久久久久久久| 日韩成人激情在线| 中文字幕久热精品在线视频| 亚洲福利在线观看| 欧美精品久久久久久久久久| 成人欧美一区二区三区在线| 国产精品久久久久7777婷婷| 国产午夜精品一区理论片飘花| 91精品综合视频| 国模叶桐国产精品一区| 久久精品青青大伊人av| 成人妇女淫片aaaa视频| 亚洲成人xxx| 国产中文欧美精品| 久久综合色88| 91久久国产精品91久久性色| 国产一区二区动漫| 亚洲最大的成人网| 欧美午夜www高清视频| 在线成人一区二区| 久久成人国产精品| 久久久久久综合网天天| 欧美野外wwwxxx| 国产精品91在线| 欧美精品一区二区免费| 精品国偷自产在线视频| 韩曰欧美视频免费观看| 在线观看日韩av| 中文字幕日韩专区| 91国在线精品国内播放| 国产精品一区专区欧美日韩| 亚洲人成网站免费播放| 国产精品女主播| 91午夜在线播放| 欧美成人精品在线视频| 欧美成人精品一区二区三区| 亚洲qvod图片区电影| 成人免费午夜电影| 亚洲欧美日韩一区在线| 中文字幕亚洲无线码在线一区| 精品福利樱桃av导航| 国产日韩欧美夫妻视频在线观看| 国产综合香蕉五月婷在线| 中文字幕精品网| 亚洲精品日产aⅴ| 国产一区二区视频在线观看| 96sao精品视频在线观看| 4388成人网| 日韩av色在线| 欧美亚洲另类视频| 国产色婷婷国产综合在线理论片a| 热re99久久精品国产66热| 亚洲美女激情视频| 97激碰免费视频| 日本精品久久久| 国产偷国产偷亚洲清高网站| 成人午夜高潮视频| 最近2019中文字幕大全第二页| 久久精品99无色码中文字幕| 亚洲成色777777在线观看影院| 国产成人在线亚洲欧美| 亚洲精品aⅴ中文字幕乱码| 久久伊人色综合| 一区二区三区回区在观看免费视频| 亚洲视频精品在线| 成人精品一区二区三区电影黑人| 三级精品视频久久久久| 亚洲电影免费观看| 欧美日韩中文字幕在线| 亚洲片在线资源|