六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

怎么創建與打開線程_C#線程的打開交互處理示例圖文詳細教程詳細說明

[摘要]如何創建和啟動線程_C#線程的啟動交互處理示例教程詳解 開發碰到很棘手的問題, 尋找解決方法. 品味程序出錯過程, 逐步跟蹤程序執行過程, 每一行代碼每一條語句全部執行, 線程處理的優點是可以創建使...

如何創建和啟動線程_C#線程的啟動交互處理示例教程詳解

開發碰到很棘手的問題, 尋找解決方法. 品味程序出錯過程, 逐步跟蹤程序執行過程, 每一行代碼每一條語句全部執行, 線程處理的優點是可以創建使用多個執行線程的應用程序。例如,某一可以具有管理與用戶交互的用戶界面線程,以及在用戶界面線程等待。

本示例講解如何創建和啟動線程,并顯示了同時在同一進程內運行的兩個線程間的交互。請注意,不必停止或釋放線程。這由公共語言運行庫自動完成。

程序從創建Alpha類型的對象和引用Alpha類的Beta方法的線程開始。然后啟動該線程。線程的IsAlive屬性允許程序等待,直到線程被初始化(被創建、被分配等)為止。

主線程通過Thread訪問,而Sleep方法通知線程放棄其時間片并在一定毫秒數期間停止執行。然后oThread被停止和聯接。聯接一個線程將使主線程等待它死亡或等待它在指定的時間后過期。最后,程序嘗試重新啟動oThread,但由于線程無法在停止(中止)后重新啟動而告失敗。有關臨時停止執行的,請參見掛起線程執行。

//StopJoin.csusingSystem;usingSystem.Threading;publicclassAlpha}};publicclassSimplecatchreturn0;}}輸出示例ThreadStart/Stop/JoinSampleAlpha.Betaisrunninginitsownthread.Alpha.Betaisrunninginitsownthread.Alpha.Betaisrunninginitsownthread.......Alpha.BetahasfinishedTrytorestarttheAlpha.BetathreadThreadStateExceptiontryingtorestartAlpha.Beta.Expectedsinceabortedthreadscannotberestarted.示例2:同步兩個線程:制造者和使用者

下面的示例顯示如何使用C#lock關鍵字和Monitor對象的Pulse方法完成同步。Pulse方法通知等待隊列中的線程對象的狀態已更改。(有關脈沖的更多詳細,請參見Monitor.Pulse方法)。

本示例創建一個Cell對象,它具有兩個方法:ReadFromCell和WriteToCell。從CellProd和CellCons類創建另外兩個對象;這兩個對象均具有調用ReadFromCell和WriteToCell的ThreadRun方法。通過等待依次到達的來自Monitor對象的“脈沖”即可完成同步。也就是說,首先產生一個項(此時使用者等待脈沖),然后發生一個脈沖,接著使用者使用所產生的項(此時制造者等待脈沖),依此類推。

//MonitorSample.cs//ThisexampleshowsuseofthefollowingmethodsoftheC#lockkeyword//andtheMonitorclass//inthreads://Monitor.Pulse//Monitor.WaitusingSystem;usingSystem.Threading;publicclassMonitorSamplecatchcatch//EventhoughMainreturnsvoid,thisprovidesareturncodeto//theparentprocess.Environment.ExitCode=result;}}publicclassCellProdpublicvoidThreadRun}publicclassCellConspublicvoidThreadRun}publicclassCellcatchcatch}Console.WriteLine;readerFlag=false;//Resetthestateflagtosayconsuming//isdone.Monitor.Pulse;//PulsetellsCell.WriteToCellthat//Cell.ReadFromCellisdone.}//ExitsynchronizationblockreturncellContents;}publicvoidWriteToCellcatchcatch}cellContents=n;Console.WriteLine;readerFlag=true;//Resetthestateflagtosayproducing//isdoneMonitor.Pulse;//PulsetellsCell.ReadFromCellthat//Cell.WriteToCellisdone.}//Exitsynchronizationblock}}輸出示例Produce:1Consume:1Produce:2Consume:2Produce:3Consume:3......Produce:20Consume:20

[page]
 

在.net中為我們提供了兩種啟動線程的方式,一種是不帶參數的啟動方式,另一種是帶參數的啟動的方式。

1:不帶參數的啟動方式,可以使用ThreadStart來實例化Thread,ThreadStart是在.Net Framework 中已經定義好的委托,ThreadStart定義為:

public delegate void ThreadStart();

使用方法如下面的代碼:

static void Main(string[] args)
{
Demo demo = new Demo();

Thread t = new Thread(new ThreadStart(demo.Run));
t.Name = "NoParameterThread";
t.Start();
}

public class Demo
{
int interval = 1000;
///


/// 不帶參數的啟動方法
///

public void Run()
{
for (int i = 0; i < 10; i++)
{
DoSomething();
}
}

private void DoSomething()
{
Console.WriteLine(string.Format("當前線程:{0},當前系統時間為:{1}", Thread.CurrentThread.Name, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
Thread.Sleep(interval);
}
}

 

2:帶參數的啟動方法,就要使用ParameterizedThreadStart委托來實例化Thread了,和ThreadStart一樣的是它也是線程啟動時要執行的方法,和ThreadStart不同的是,它在實例化時可以用一個帶有一個Object參數的方法作為構造函數的參數,而實例化ThreadStart時所用到的方法是沒有參數的。ParameterizedThreadStart定義為:

public delegate void ParameterizedThreadStart(object obj);

使用方法如下面的代碼:

public class Demo
{
int interval = 1000;

private void DoSomething()
{
Console.WriteLine(string.Format("當前線程:{0},當前系統時間為:{1}", Thread.CurrentThread.Name, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
Thread.Sleep(interval);
}

///


/// 帶參數的啟動方法
///

///
public void Run(object param)
{
if (param == null)
return;

int.TryParse(param.ToString(), out interval);
for (int i = 0; i < 10; i++)
{
DoSomething();
}
}

}

 

static void Main(string[] args)
{
Demo demo = new Demo();

Thread parameterThread = new Thread(new ParameterizedThreadStart(demo.Run));
parameterThread.Name = "ParameterThread";
parameterThread.Start(2000);
}

3:在很多時候,我們遇到的情況是要傳遞多個參數,注意到ParameterizedThreadStart委托的參數類型是一個Object對象,為什么是Object這樣的參數呢?很簡單,因為在.net中Object是所有類型的基類。這樣我們可以聲明一個類,為這個類增加屬性,這些屬性也就是參數。

使用方法如下面的代碼:

static void Main(string[] args)
{
Demo demo = new Demo();

ThreadParamter p = new ThreadParamter(2000,100);
Thread multiParameterThread = new Thread(new ParameterizedThreadStart(demo.CustomerParamterRun));
multiParameterThread.Name = "MultiParameterThread";
multiParameterThread.Start(p);
}

public class Demo
{
///


/// 帶多個參數的啟動方法
///

///
public void CustomerParamterRun(object param)
{
if (param == null)
return;

ThreadParamter p = param as ThreadParamter;
if (p != null)
{
for (int i = 0; i < p.LoopCount; i++)
{
Console.WriteLine(string.Format("當前線程:{0},當前系統時間為:{1}", Thread.CurrentThread.Name, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
Thread.Sleep(p.Interval);
}
}
}
}

public class ThreadParamter
{
public int Interval { get; set; }
public int LoopCount { get; set; }

public ThreadParamter()
{ }

public ThreadParamter(int interval, int loopCount)
{
this.Interval = interval;
this.LoopCount = loopCount;
}
}

 

4:在遇到業務非常復雜的時候,上面寫法還是有問題,封裝不夠好,我們可以使用裝飾模式,對上面的代碼進行改進。這樣業務發生改變的時候,我們只需要修改核心的實現部分,調用的方法可以不用做任何修改,而且調用方法的代碼非常簡潔。

修改后的代碼如下:

 static void Main(string[] args)
        {
            DecoratorThread t = new DecoratorThread(new ThreadParamter(2000, 100));
            t.Start();
        }

public class ThreadParamter
{
public int Interval { get; set; }
public int LoopCount { get; set; }

public ThreadParamter()
{ }

public ThreadParamter(int interval, int loopCount)
{
this.Interval = interval;
this.LoopCount = loopCount;
}
}

///


/// 使用裝飾模式來實現多個參數的
///

public class DecoratorThread
{
private ThreadParamter threadParamter;
private Thread thread;


public DecoratorThread(ThreadParamter threadParamter)
{
this.threadParamter = threadParamter;
thread = new Thread(new ThreadStart(Run));
thread.Name = "DecoratorThread";
}

public void Start()
{
if (thread != null)
{
thread.Start();
}
}

private void Run()
{
for (int i = 0; i < threadParamter.LoopCount; i++)
{
Console.WriteLine(string.Format("當前線程:{0},當前系統時間為:{1}", Thread.CurrentThread.Name, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
Thread.Sleep(threadParamter.Interval);
}
}
}

 


學習教程快速掌握從入門到精通的電腦知識




主站蜘蛛池模板: 亚洲成a人片在线观看导航 亚洲成a人片在线观看播放 | 四虎永久免费地址在线观看 | 天天躁夜夜躁狠狠躁2018a | 日韩亚洲欧美综合一区二区三区 | 欧美一区网站 | 四虎永久免费影院在线 | 午夜性爽快免费视频播放 | 亚欧乱色精品免费观看 | 午夜小片 | 天天噜天天干 | 日韩亚洲欧美综合一区二区三区 | 日韩a一级欧美一级在线播放 | 亚洲第一视频 | 日本乱中文字幕系列在线观看 | 欧美视频导航| 中文字幕福利 | 青草香蕉精品视频在线观看 | 日韩精品一区二区三区不卡 | 日韩在线小视频 | 午夜视频在线观看免费观看在线观看 | 天天干天天草天天射 | 日韩一级片在线免费观看 | 清清草免费视频 | 色噜噜狠狠成人网 | 最近韩国中文字幕更新 | 色综合久久中文字幕网 | 日韩一区三区 | 亚洲精品在线观看视频 | 性日韩精品 | 午夜影院普通用户体验区 | 亚洲影音| 午夜欧美激情 | 中文字幕在线精品不卡 | 中文字幕福利片 | 色噜噜狠狠狠综合曰曰曰88av | 天堂网2021天堂手机版丶 | 日韩精品视频观看 | 在线天堂中文新版www | 香蕉久久一区二区三区 | 青娱极品盛宴国产精品分类 | 日韩中文字幕在线不卡 |