C#多線程參數傳遞

來源:互聯網
上載者:User

在多線程或單線程任務中,讓線程帶傳入參數一直是個麻煩的問題,通常有種方法就是以類,對像的變數來傳參數,這種方法理解上很簡單不過在某些場合使用很麻煩,這裡就不介紹了,我們主要介紹一種.NET2.0中新增加的帶參數運行線程的方法,樣本程式如下:

ParameterizedThreadStart ParStart = new ParameterizedThreadStart(ThreadMethod);Thread myThread = new Thread(ParStart);object o = “hello”;myThread.Start(o);ThreadMethod如下:public void ThreadMethod(object ParObject){//程式碼}

 

如果是多參數的話可以以數組或動態列表等方式裝相入 object,然後使用時拆箱即可

這樣是不是簡單多了哈,,,
———————————————————————————–
[轉]個人認為,還是為線程建立一個單獨的類,在類的初始化函數裡頭為類裡頭的變數賦值,來達到傳入參數比較簡單。下面有些方法是有問題的,不過我已經達到了目的就懶得去排錯了,哪位朋友看出問題了提醒一下啊。呵呵…

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

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

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

 

2.子線程入口函數:////// Thread function interface///private void ThreadFun(){// Create invoke method by specific functionMethodInvoker 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){// ….}

 

—————————————————————————-

—————————————————————————-
C#線程調用帶參數的方法
之前做了一個小的應用程式,用的是c#語言,在做的過程中遇到了一個困難,就是不如調用帶參數的線程,經過尋找網上的資料,找到了簡單的解決方案。
在以前的學習中,我們經常碰到的是沒有帶參數的線程,所以當遇到必須用到參數的線程時就會手足無措,現在我們用的這種解決問題的方法,實際上的原理是:將線程執行的方法和參數都封裝到一個類裡面。通過執行個體化該類,方法就可以調用屬性來實現間接的型別安全地傳遞參數。看如下代碼:

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.”);
}
}
從上面的例子就能很清楚的得到我們想要的結果,注意這句代碼的用法:
Thread t = new Thread(new ThreadStart(tws.ThreadProc));

戀花望月輕輕唱 聽雨隨風悄悄追

在多線程或單線程任務中,讓線程帶傳入參數一直是個麻煩的問題,通常有種方法就是以類,對像的變數來傳參數,這種方法理解上很簡單不過在某些場合使用很麻煩,這裡就不介紹了,我們主要介紹一種.NET2.0中新增加的帶參數運行線程的方法,樣本程式如下:

ParameterizedThreadStart ParStart = new ParameterizedThreadStart(ThreadMethod);Thread myThread = new Thread(ParStart);object o = “hello”;myThread.Start(o);ThreadMethod如下:public void ThreadMethod(object ParObject){//程式碼}

 

如果是多參數的話可以以數組或動態列表等方式裝相入 object,然後使用時拆箱即可

這樣是不是簡單多了哈,,,
———————————————————————————–
[轉]個人認為,還是為線程建立一個單獨的類,在類的初始化函數裡頭為類裡頭的變數賦值,來達到傳入參數比較簡單。下面有些方法是有問題的,不過我已經達到了目的就懶得去排錯了,哪位朋友看出問題了提醒一下啊。呵呵…

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

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

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

 

2.子線程入口函數:////// Thread function interface///private void ThreadFun(){// Create invoke method by specific functionMethodInvoker 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){// ….}

 

—————————————————————————-

—————————————————————————-
C#線程調用帶參數的方法
之前做了一個小的應用程式,用的是c#語言,在做的過程中遇到了一個困難,就是不如調用帶參數的線程,經過尋找網上的資料,找到了簡單的解決方案。
在以前的學習中,我們經常碰到的是沒有帶參數的線程,所以當遇到必須用到參數的線程時就會手足無措,現在我們用的這種解決問題的方法,實際上的原理是:將線程執行的方法和參數都封裝到一個類裡面。通過執行個體化該類,方法就可以調用屬性來實現間接的型別安全地傳遞參數。看如下代碼:

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.”);
}
}
從上面的例子就能很清楚的得到我們想要的結果,注意這句代碼的用法:
Thread t = new Thread(new ThreadStart(tws.ThreadProc));

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.