日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#语法:多线程编程(Thread)

發布時間:2024/10/14 C# 156 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#语法:多线程编程(Thread) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

操作系統為了提高效率將一個進程分成多個線程。有一個主線程其他的都為子線程,在認識多線程前,我們的代碼都是在主線程中執行的。都有一個規則就是 必須執行當前代碼才會執行之后的代碼。那么問題就來了,假如說有一個非常耗時的操作,比如加載數據或文件下載,難不成數據加載完之前,之后的代碼以及其他代碼都不執行嗎?我們用過不少軟件,比如迅雷、百度云,在下載文件的時候還可以進行其他操作,程序不會因為當前任務沒執行完而停止。這就運用到了線程。如果將一個耗時10秒的操作放到主線程中,當程序執行到這段代碼的時候就會卡機,也就是程序未響應。一種方法是用戶等待10秒后讓程序執行完,但大多數用戶會選擇后者:關閉程序。

一、Thread 類:(System.Threading.Thread)

表示托管線程,運行在.NET平臺之上的,每一個Thread對象代表一個線程,多線程開發就有多個Thread對象。每一個線程都對應著一個任務(方法)。


二、示例代碼;該窗體有3個控件一個label,兩個button

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Threading;namespace Csharp窗體練習 {public partial class Form1 : Form{ public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){}private int count = 0;private void btnCounter_Click(object sender, EventArgs e){Thread objThread = new Thread(delegate() {for (int i = 0; i < 5; i++){Thread.Sleep(1000);if (label1.InvokeRequired){label1.Invoke(new Action((s,num) => { label1.Text = s+num; }) , count.ToString(),i);}}});objThread.IsBackground = true;objThread.Start();count++;}private void btnClear_Click(object sender, EventArgs e){count=0;}} }

首先第一步是創建Thread 對象: Thread objThread=new Thread(<參數>);Thread構造方法中有參數,可以選中Thread按F1查看幫助文檔.翻開這些參數的定義:

public delegate void ParameterizedThreadStart(object obj )

ParameterizedThreadStart其實就是一個無返回值帶參數的一個委托。

public delegate void ThreadStart()

當然這就是一個無參數的委托。總結起來就是Thread構造方法里要放一個委托...所以上述使用了匿名方法當然也可以使用lambda表達式在匿名方法里寫要操作的內容。

之后別忘了把線程IsBackground 屬性設為true,默認為前臺線程,設為true時為后臺線程。前臺線程與后臺線程的區別是,應用程序必須在所有前臺線程完成后才關閉,而后臺線程,應用程序可以不考慮后臺線程是否執行完,應用程序關閉后臺線程自動關閉。如果你關閉了某個應用程序,但是在進程中發現該應用程序還在運行,說明該程序的前臺進程還在運行。要么是編程的時候不注意,也有可能是流氓軟件。

最后把線程start就可以了。

但是,在子線程中無法直接訪問主線程的可視化控件,主線程和子線程就像各部門一樣,做自己的事情,但是想隨意訪問內部消息是不允許的。雖然不能直接訪問但是能間接訪問吶,便可以使用Invoke()方法來實現。 ? Invoke(<delegate method>,object ?args[]) ,第一個參數是通過委托調用的方法,之后的參數都是傳給這委托的參數的值。在此之前判斷InvokeRequired 是否必須調用Invoke方法。

Invoke方法第一個參數我用了Action。Action和Func都內置了委托,Action為無返回值的匿名方法,而Func有返回值 ? Func<參數1,參數2...,參數n,返回值>,除最后一個是返回值,之前的都是要傳給方法的參數.

總結

以上是生活随笔為你收集整理的C#语法:多线程编程(Thread)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。