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

首頁 > 編程 > C# > 正文

C#實現向多線程傳參的三種方式實例分析

2020-01-24 01:23:23
字體:
來源:轉載
供稿:網友

本文實例講述了C#實現向多線程傳參的三種方式。分享給大家供大家參考,具體如下:

從《C#高級編程》了解到給線程傳遞參數有兩種方式,一種方式是使用帶ParameterizedThreadStart委托參數的Thread構造函數,另一種方式是創建一個自定義類,把線程的方法定義為實例的方法,這樣就可以初始化實例的數據,之后啟動線程。

方式一:使用ParameterizedThreadStart委托

如果使用了ParameterizedThreadStart委托,線程的入口必須有一個object類型的參數,且返回類型為void。且看下面的例子:

using System;using System.Threading;namespace ThreadWithParameters{  class Program  {    static void Main(string[] args)    {      string hello = "hello world";      //這里也可簡寫成Thread thread = new Thread(ThreadMainWithParameters);      //但是為了讓大家知道這里用的是ParameterizedThreadStart委托,就沒有簡寫了      Thread thread = new Thread(new ParameterizedThreadStart(ThreadMainWithParameters));      thread.Start(hello);      Console.Read();    }    static void ThreadMainWithParameters(object obj)    {      string str = obj as string;      if(!string.IsNullOrEmpty(str))        Console.WriteLine("Running in a thread,received: {0}", str);    }  }}

這里稍微有點麻煩的就是ThreadMainWithParameters方法里的參數必須是object類型的,我們需要進行類型轉換。為什么參數必須是object類型呢,各位看看ParameterizedThreadStart委托的聲明就知道了。

public delegate void ParameterizedThreadStart(object obj);   //ParameterizedThreadStart委托的聲明

方式二:創建自定義類

定義一個類,在其中定義需要的字段,將線程的主方法定義為類的一個實例方法,說得不是很明白,還是看實際的例子吧。

using System;using System.Threading;namespace ThreadWithParameters{  public class MyThread  {    private string data;    public MyThread(string data)    {      this.data = data;    }    public void ThreadMain()    {      Console.WriteLine("Running in a thread,data: {0}", data);    }  }  class Program  {    static void Main(string[] args)    {      MyThread myThread = new MyThread("hello world");      Thread thread = new Thread(myThread.ThreadMain);      thread.Start();      Console.Read();    }  }}

對這種方法也不是很滿意,總不能一遇到比較耗時的方法,就新建一個類吧。。。

那有什么更好辦法即不用強制類型轉換,也不用新建一個類呢?

下面就介紹下我無意中找到的一個方法,具體是在哪見過的我也不記得了,罪過啊。。

方式三:使用匿名方法

using System;using System.Threading;namespace ThreadWithParameters{  class Program  {    static void Main(string[] args)    {      string hello = "hello world";      //如果寫成Thread thread = new Thread(ThreadMainWithParameters(hello));這種形式,編譯時就會報錯      Thread thread = new Thread(() => ThreadMainWithParameters(hello));      thread.Start();      Console.Read();    }    static void ThreadMainWithParameters(string str)    {       Console.WriteLine("Running in a thread,received: {0}", str);    }  }}

哇,你會發現既不用類型強制轉換也不用新建類就運行成功了。

但是為什么這種方式能行呢,根據昨天 @亂舞春秋 的提示,我也用ildasm反編譯了一下,確實如他所說,我所謂的第三種方式其實和第二種方式是一樣的,只不過自定義類編譯器幫我們做了。

下面的是第三種方式main方法反編譯的IL代碼:

.method private hidebysig static void Main(string[] args) cil managed{  .entrypoint  // 代碼大小    51 (0x33)  .maxstack 3  .locals init ([0] class [mscorlib]System.Threading.Thread thread,       [1] class ThreadWithParameters.Program/'<>c__DisplayClass1' 'CS$<>8__locals2')  IL_0000: newobj   instance void ThreadWithParameters.Program/'<>c__DisplayClass1'::.ctor()  IL_0005: stloc.1  IL_0006: nop  IL_0007: ldloc.1  IL_0008: ldstr   "hello world"  IL_000d: stfld   string ThreadWithParameters.Program/'<>c__DisplayClass1'::hello  IL_0012: ldloc.1  IL_0013: ldftn   instance void ThreadWithParameters.Program/'<>c__DisplayClass1'::'<Main>b__0'()  IL_0019: newobj   instance void [mscorlib]System.Threading.ThreadStart::.ctor(object, native int)  IL_001e: newobj   instance void [mscorlib]System.Threading.Thread::.ctor(class [mscorlib]System.Threading.ThreadStart)  IL_0023: stloc.0  IL_0024: ldloc.0  IL_0025: callvirt  instance void [mscorlib]System.Threading.Thread::Start()  IL_002a: nop  IL_002b: call    int32 [mscorlib]System.Console::Read()  IL_0030: pop  IL_0031: nop  IL_0032: ret} // end of method Program::Main

在看看第二種方式的IL代碼:

.method private hidebysig static void Main(string[] args) cil managed{  .entrypoint  // 代碼大小    44 (0x2c)  .maxstack 3  .locals init ([0] class ThreadWithParameters.MyThread myThread,       [1] class [mscorlib]System.Threading.Thread thread)  IL_0000: nop  IL_0001: ldstr   "hello world"  IL_0006: newobj   instance void ThreadWithParameters.MyThread::.ctor(string)  IL_000b: stloc.0  IL_000c: ldloc.0  IL_000d: ldftn   instance void ThreadWithParameters.MyThread::ThreadMain()  IL_0013: newobj   instance void [mscorlib]System.Threading.ThreadStart::.ctor(object, native int)  IL_0018: newobj   instance void [mscorlib]System.Threading.Thread::.ctor(class [mscorlib]System.Threading.ThreadStart)  IL_001d: stloc.1  IL_001e: ldloc.1  IL_001f: callvirt  instance void [mscorlib]System.Threading.Thread::Start()  IL_0024: nop  IL_0025: call    int32 [mscorlib]System.Console::Read()  IL_002a: pop  IL_002b: ret} // end of method Program::Main

比較兩端代碼,可以發現兩者都有一個newobj,這句的作用是初始化一個類的實例,第三種方式由編譯器生成了一個類:c__DisplayClass1

IL_0000: newobj   instance void ThreadWithParameters.Program/'<>c__DisplayClass1'::.ctor()IL_0006: newobj   instance void ThreadWithParameters.MyThread::.ctor(string)

注意:簡單并不一定是好事,匿名方法容易造成不易察覺的錯誤

希望本文所述對大家C#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久天天躁狠狠躁夜夜av| 欧美日韩在线影院| 国产精品福利网站| 亚洲最大中文字幕| 777精品视频| 在线观看久久av| 亚洲成在人线av| 91欧美精品午夜性色福利在线| 亚洲国产精品成人精品| 久青草国产97香蕉在线视频| 欧美电影在线观看网站| 精品国产乱码久久久久久婷婷| 成人女保姆的销魂服务| 欧美成人精品激情在线观看| 亚洲视频国产视频| 成人av在线亚洲| 97欧美精品一区二区三区| 日韩在线观看免费高清| 亚洲一区免费网站| 国产精品午夜国产小视频| 91视频九色网站| 国产精品成人在线| 久久久久久中文字幕| 精品人伦一区二区三区蜜桃网站| 亚洲成人动漫在线播放| 亚洲欧美一区二区精品久久久| 欧美激情va永久在线播放| 日韩最新中文字幕电影免费看| 在线观看91久久久久久| 欧美精品videosex极品1| 国产精品丝袜白浆摸在线| 97视频免费在线观看| 久久露脸国产精品| 国语自产精品视频在线看一大j8| 亚洲天堂av图片| 在线日韩中文字幕| 国产视频精品va久久久久久| 97视频在线观看视频免费视频| 日韩一区二区三区在线播放| 欧美激情影音先锋| 亚洲国产精彩中文乱码av在线播放| 国产精品久久久久久久9999| 久久久精品2019中文字幕神马| 日韩电影免费在线观看中文字幕| 国产专区欧美专区| 日韩在线观看网址| 国产精品久久久久福利| 亚洲成人黄色在线| www.日韩.com| 欧美激情国产日韩精品一区18| 懂色av一区二区三区| 亚洲国产精品久久精品怡红院| 成人观看高清在线观看免费| 疯狂蹂躏欧美一区二区精品| 久久精品亚洲国产| 日韩av第一页| 最新国产成人av网站网址麻豆| 8x拔播拔播x8国产精品| 久久琪琪电影院| 色yeye香蕉凹凸一区二区av| 尤物yw午夜国产精品视频明星| 国产成人一区二区三区小说| 国产精品最新在线观看| www国产精品com| 欧美做受高潮1| 欧美中文字幕第一页| 91久久精品国产| 欧美日韩在线视频首页| 91精品免费久久久久久久久| 国产精品久久久久久婷婷天堂| 亚洲成人在线网| 人人澡人人澡人人看欧美| 久久天堂av综合合色| 欧美午夜精品在线| 日韩精品中文字幕视频在线| 国产一区玩具在线观看| 亚洲精品国产综合区久久久久久久| 国产欧美精品一区二区三区-老狼| 国产精品久久久久久网站| 狠狠干狠狠久久| 免费91在线视频| 国产一区二区三区久久精品| 日韩电影免费观看在线| 色多多国产成人永久免费网站| 亚洲免费小视频| 亚洲电影成人av99爱色| 久久91亚洲精品中文字幕奶水| 中文字幕日韩有码| 亚洲性夜色噜噜噜7777| 国产ts一区二区| 欧美国产日韩一区二区| 国产精品美女免费| 欧美亚洲成人免费| 精品日韩美女的视频高清| 亚洲视频axxx| 国产成人一区二区三区电影| 欧美在线视频导航| 亚洲激情视频网| 国产亚洲美女精品久久久| 日韩av不卡在线| 欧美日韩国产成人在线观看| 欧美麻豆久久久久久中文| 国产欧美一区二区三区久久| 91在线观看免费高清完整版在线观看| www.久久久久久.com| 91在线|亚洲| 亚洲欧美在线免费观看| 亚洲精品国产精品国自产在线| 亚洲欧美制服另类日韩| 国产成人综合av| 欧美另类交人妖| 91国产中文字幕| 欧美中文字幕视频| 日韩大陆毛片av| 国产亚洲美女久久| 国产一区二区三区四区福利| 川上优av一区二区线观看| 欧美日韩国产一区中文午夜| 日韩精品在线播放| www.欧美三级电影.com| 国产日韩精品综合网站| 国产精品十八以下禁看| 成人国产在线激情| 国产成人精品综合| 欧美高跟鞋交xxxxhd| 欧美在线不卡区| 91高清视频在线免费观看| 国产最新精品视频| 日韩免费在线免费观看| 国产精品久久久久久久午夜| 中文日韩在线视频| 亚洲天堂开心观看| www亚洲精品| 日韩不卡中文字幕| 色先锋久久影院av| 欧美日韩在线视频首页| 人人爽久久涩噜噜噜网站| 日韩欧亚中文在线| 欧美日韩国产一区在线| 亚洲偷欧美偷国内偷| 成人啪啪免费看| 国产一区二区香蕉| 欧美超级免费视 在线| 亚洲午夜色婷婷在线| 久久精品国产欧美亚洲人人爽| 久久久久久久香蕉网| 国产精品欧美亚洲777777| 96国产粉嫩美女| 久久综合免费视频| 亚洲人午夜色婷婷| 夜夜嗨av一区二区三区免费区| 欧美黑人一区二区三区| 狠狠操狠狠色综合网| 日韩乱码在线视频| 欧美性xxxx18| 九色成人免费视频| 日韩天堂在线视频| 欧美国产日韩免费| 日本一区二区三区在线播放| 亚洲国产美女精品久久久久∴| 国产v综合ⅴ日韩v欧美大片| 欧美视频一区二区三区…| 91在线视频精品| 国产成+人+综合+亚洲欧美丁香花|