threadに引数





from https://futuremix.org/2011/08/parameterizedthreadstart-thread-parameter

スレッドで呼び出すメソッドに引数を与えるときには、どうすればよいでしょうか。.NET 2.0 からはこの方法が用意されています。
//スレッドに渡す引数オブジェクト (ここでは Stringの配列にしているが何でも良い)
String[] param = {"あああ", "123", null};
ParameterizedThreadStart ts = new ParameterizedThreadStart(HogeFinc);
Thread thread = new Thread(ts);
Thread.start(param);
……
  function void HogeFunc(Object obj)
  {
  String[] param = (String[])obj;
   //スレッドで実行したい処理
  ……
  }

ParameterizedThreadStart を利用して Thread オブジェクトを作成することで、thread の Start に渡した引数を分けとることができます。引数は object 型として渡ってくるので、呼び出されたメソッド側で、本来の型にキャストして使用します。






from https://dotblogs.com.tw/ken74114/2010/12/08/19988
ThreadPool.QueueUserWorkItem多執行緒
善用多執行緒的技巧,可以讓應用程式執行的更順暢,減少因進行長時間動作而使UI凍結的情況。但執行緒也不是免費的,每個執行緒需要大約1 MB的記憶體,建立及啟動也需要花一點時間,為了減輕建立執行緒時所耗費的時間,.NET Framework 2.0提出了Thread Pooling概念,底層CLR會維持固定數量的執行緒運行,當設計師透過呼叫QueueUserWorkItem函式將delegate傳入時,Thread Pool會查看目前是否有閒置的ThreadPool池中,有的話就讓這個Thread來呼叫傳入的delegate,否的話就建立一個新的Thread來執行,Thread Pool透過預建Thread的方式,來減少因頻繁建立/釋放 Thread而耗費的時間。

from https://dotblogs.com.tw/yc421206/2011/01/15/20821
傳入一個參數
static void Main(string[] args)
{
    for (int i = 0; i < 10; i++)
    {
        ThreadPool.QueueUserWorkItem(new WaitCallback(DoWorker), i);
    }
    Console.WriteLine("Main thread exit");
    Console.ReadKey();
}
static void DoWorker(object number)
{
    Thread t = Thread.CurrentThread;
    Console.WriteLine("No.{0}-Thread[{1}]:{2}", number, t.ManagedThreadId, t.ThreadState);
    Thread.Sleep(1000);
}

因為閒置的執行緒被喚醒,所以可以看到,有許多重複的執行緒會出現
image

傳入多個參數
若需要傳入不只一個參數,我們可以利用類別(class)或結構(struct)來傳入,當然你也可以傳入集合…反正你想的到的資料型態什麼都能傳,只要再DoWorker方法裡記得轉型就可以了。
static void Main(string[] args)
{
    Book book = new Book();
    book.author = "余小章";
    book.price = 1000;
    book.title = "MVP";
    ThreadPool.QueueUserWorkItem(new WaitCallback(DoWorker), book); 

    Console.WriteLine("Main thread exit");
    Console.ReadKey();
}
static void DoWorker(object book)
{
    Thread t = Thread.CurrentThread;
    Book b = (Book)book;
    Console.WriteLine("Thread[{0}]:{1}", t.ManagedThreadId, t.ThreadState);
    Console.WriteLine("author:{0},title{1},price:{2}", b.author, b.title, b.price); 

    Thread.Sleep(1000);
}
public struct Book
{
    public decimal price;
    public string title;
    public string author;
}
 
image 
若有謬誤,煩請告知,新手發帖請



留言

熱門文章