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

歡迎訪問 生活随笔!

生活随笔

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

C#

C#线程调用带参数的方法 ~

發布時間:2023/12/19 C# 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#线程调用带参数的方法 ~ 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在 .NET Framework 2.0 版中,要實現線程調用帶參數的方法有兩種辦法。

第一種:使用ParameterizedThreadStart。

調用 System.Threading.Thread.Start(System.Object) 重載方法時將包含數據的對象傳遞給線程。

使用 ParameterizedThreadStart 委托不是傳遞數據的類型安全的方法,因為 System.Threading.Thread.Start(System.Object) 方法重載接受任何對象。

這種方法不推薦使用,故在此不做詳細介紹,具體用法參見:http://msdn2.microsoft.com/zh-cn/library/system.threading.parameterizedthreadstart(VS.80).aspx

ParameterizedThreadStart?ParStart?=?new?ParameterizedThreadStart(ThreadMethod);
Thread?myThread?
=?new?Thread(ParStart);
object?o?=?"hello";
myThread.Start(o);

//ThreadMethod如下:
public?void?ThreadMethod(object?ParObject)
{
????
//程序代碼
}



第二種:將線程執行的方法和參數都封裝到一個類里面。通過實例化該類,方法就可以調用屬性來實現間接的類型安全地傳遞參數。

具體代碼如下(本示例來自MSDN)

using?System;
using?System.Threading;

//ThreadWithState?類里包含了將要執行的任務以及執行任務的方法
public?class?ThreadWithState?{
????
//要用到的屬性,也就是我們要傳遞的參數
????private?string?boilerplate;
????
private?int?value;

????
//包含參數的構造函數
????public?ThreadWithState(string?text,?int?number)?
????{
????????boilerplate?
=?text;
????????value?
=?number;
????}

????
//要丟給線程執行的方法,本處無返回類型就是為了能讓ThreadStart來調用
????public?void?ThreadProc()?
????{
????????
//這里就是要執行的任務,本處只顯示一下傳入的參數
?????????Console.WriteLine(boilerplate,?value);?
????}
}

//用來調用上面方法的類,是本例執行的入口
public?class?Example?{
????
public?static?void?Main()?
????{
????????
//實例化ThreadWithState類,為線程提供參數
????????ThreadWithState?tws?=?new?ThreadWithState(
????????????
"This?report?displays?the?number?{0}.",?42);

????????
//?創建執行任務的線程,并執行
????????Thread?t?=?new?Thread(new?ThreadStart(tws.ThreadProc));
????????t.Start();
????????Console.WriteLine(
"Main?thread?does?some?work,?then?waits.");
????????t.Join();
????????Console.WriteLine(
????????????
"Independent?task?has?completed;?main?thread?ends.");??
????}
}

============================================================================

方法一:
在VS2003中,也不能直接訪問,參看??
一般來說,直接在子線程中對窗體上的控件操作是會出現異常,這是由于子線程和運行窗體的線程是不同的空間,因此想要在子線程來操作窗體上的控件,是不可能 簡單的通過控件對象名來操作,但不是說不能進行操作,微軟提供了Invoke的方法,其作用就是讓子線程告訴窗體線程來完成相應的控件操作。??

現在用一個用線程控制的進程條來說明,大致的步驟如下:??

1.創建Invoke函數,大致如下:??
/// <summary>??
/// Delegate function be invoked by main thread??
/// </summary>??
private???? void???? InvokeFun()??
{??
??? if(prgBar.Value< 100)??
??? prgBar.Value = prgBar.Value + 1;??
}??

2.子線程入口函數:??
/// <summary>??
/// Thread function interface??
/// </summary>??
private void ThreadFun()??
{??
??? // Create invoke method by specific function
??? MethodInvoker mi = new MethodInvoker(this.InvokeFun);??

??? for(int i=0; i<100; i++)??
??? {??
????? this.BeginInvoke(mi);????
????? Thread.Sleep(100);??
??? }??
}

3.創建子線程:??
Thread thdProcess = new Thread(new ThreadStart(ThreadFun));??
thdProcess.Start();??

備注:??
??? using System.Threading;??
??? private System.Windows.Forms.ProgressBar prgBar;??

方法二:
加入該句:Control.CheckForIllegalCrossThreadCalls = False??? 取消線線程安全保護模式!

方法三:帶參數
使用類、類的方法或類的屬性都可以向線程傳遞參數:
public class UrlDownloader
{
??? string url;
??
??? public UrlDownloader (string url)
??? {
????? this.url = url;
??? }
??
??? public void Download()
??? {
????? WebClient wc = new WebClient();
????? Console.WriteLine("Downloading " + url);????????????????????????
????? byte[] buffer = wc.DownloadData (url);
????? string download = Encoding.ASCII.GetString(buffer);
????? Console.WriteLine(download);
????? Console.WriteLine("Download successful.");
????
????? //這里你可以將download進行保存等處理......
??? }
}

[... 在另一個類中使用它們...]
??????????????
UrlDownloader downloader = new UrlDownloader (yourUrl);
new Thread (new ThreadStart (downloader.Download)).Start();

注意參數是如何傳遞的。

方法四:帶參數
ThreadStart starter = delegate { Download(yourUrl); };
new Thread(starter).Start();

//使用線程池
WaitCallback callback = delegate (object state) { Download ((string)state); };
ThreadPool.QueueUserWorkItem (callback, yourUrl);

方法五:帶參數
Thread t = new Thread (new ParameterizedThreadStart(DownloadUrl));
t.Start (myUrl);
static void DownloadUrl(object url)
{
??// ....
}

轉載于:https://www.cnblogs.com/GT_Andy/archive/2010/05/27/1921768.html

總結

以上是生活随笔為你收集整理的C#线程调用带参数的方法 ~的全部內容,希望文章能夠幫你解決所遇到的問題。

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