none
執行緒一問 RRS feed

  • 問題

  • 我看了他的建構 和範例 只能用沒參數和回傳的嗎?

    為什麼"threadWork.DoWork"這個部分 ~ 我放有參數或回傳的方法的就會錯呢?


    範例:
    using System;
    using System.Threading;

    class Test
    {
        static void Main()
        {
            Work threadWork = new Work();
            Thread newThread =
                new Thread(new ThreadStart(threadWork.DoWork));
            newThread.Start();
        }
    }

    class Work
    {
        public Work() {}

        public void DoWork() {}
    }
    2009年7月14日 上午 03:13

解答

  • 你用單執行緒的邏輯去寫多執行緒,當然不會正確。以下是一個範例, 以兩種不同的方法傳遞參數.
    1. Work class 用 ParameterizedThreadStart 委派 , 注意傳入參數一定得用 Object型別
    2. Work1 class 用封裝執行緒程序和資料方式來傳遞並以回呼方式接收資料
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;

    namespace ThreadTest_0
    {
        public partial class Form1 : Form
        {
            public delegate void myCallback(int i);

            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                Work threadWork = new Work();
                Thread newThread = new Thread(threadWork.DoWork);
                              
                newThread.Start(1);

                Work1 threadWork1 = new Work1(2, new myCallback(ReturnCode));
                Thread newThread1 = new Thread(threadWork1.DoWork);
                newThread1.Start();
            }

            public void ReturnCode(int i)
            {
                MessageBox.Show("回傳" + i.ToString());
            }

            class Work
            {
            
                public void DoWork(object i)
     
                {
                    MessageBox.Show(i.ToString());
                }
            }


            class Work1
            {
                private myCallback callback0;
                private int iNo;
                public Work1(int i,myCallback callback1)
                {
                    iNo = i;
                    callback0 = callback1;
                }

                public void DoWork()
                {
                    MessageBox.Show(iNo.ToString());
                    if (callback0 != null)
                    {
                        callback0(iNo + 10);
                    }

                }

             }
        }
    }


    請關心自己的問題,不要問了就放空;這是對別人與自己的尊重
    2009年7月14日 上午 05:16
    版主

所有回覆

  • 你是什麼寫的?

    2009年7月14日 上午 03:19
  • HI,

    ThreadStart委派所指定的方法一定要宣告成沒有參數和沒有傳回值, 如果要宣告成有參考, 必須改用ParameterizedThreadStart 委派.
    2009年7月14日 上午 03:55
  • 你可以先參考一下MSDN文件庫中關於 [Thread 類別 ]的說明
    以下引述自此說明:

    處理序可建立一個以上的執行緒,來執行與處理序相關的一部分程式碼。請使用 ThreadStart 委派 (Delegate) 或 ParameterizedThreadStart 委派來指定執行緒所執行的程式碼。ParameterizedThreadStart 委派可以讓您將資料傳遞到執行緒程序。

    另請參閱[建立執行緒並在啟動時間傳遞資料 ] , 這有說明如何傳遞與利用回呼取回資料

     


    請關心自己的問題,不要問了就放空;這是對別人與自己的尊重
    2009年7月14日 上午 04:10
    版主
  • 我是想練習使用執行緒~我想用程式B來呼叫類別C的set()傳入數值並用get()來獲得修改的數值
    這樣寫可能很奇怪~不過我只是在練習執行緒的部分

    程式B的部分因為一直錯所以還沒全部完成~但是new Thread那行一直錯參數的部分 但是用沒有參數或回傳的就可以

    類別C:

    namespace C
    {
        public class cc
        {
            private int x = 0;
            public  void set(int y)
            {
                x = y;
            }       
            public  int get()
            {
                return x;
            }
         }
    }


    程式B:

    namespace B
    {
        class bb
        {
            static void Main(string[] args)
            {
                int x = 1;
                do
                {

                   cc c = new cc();
                    x = Console.Read();
                    Thread newThread = new Thread(new ThreadStart(c.set));
                   
                } while (x != 0);
               
            }
        }
    }

    2009年7月14日 上午 04:14
  • 你用單執行緒的邏輯去寫多執行緒,當然不會正確。以下是一個範例, 以兩種不同的方法傳遞參數.
    1. Work class 用 ParameterizedThreadStart 委派 , 注意傳入參數一定得用 Object型別
    2. Work1 class 用封裝執行緒程序和資料方式來傳遞並以回呼方式接收資料
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;

    namespace ThreadTest_0
    {
        public partial class Form1 : Form
        {
            public delegate void myCallback(int i);

            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                Work threadWork = new Work();
                Thread newThread = new Thread(threadWork.DoWork);
                              
                newThread.Start(1);

                Work1 threadWork1 = new Work1(2, new myCallback(ReturnCode));
                Thread newThread1 = new Thread(threadWork1.DoWork);
                newThread1.Start();
            }

            public void ReturnCode(int i)
            {
                MessageBox.Show("回傳" + i.ToString());
            }

            class Work
            {
            
                public void DoWork(object i)
     
                {
                    MessageBox.Show(i.ToString());
                }
            }


            class Work1
            {
                private myCallback callback0;
                private int iNo;
                public Work1(int i,myCallback callback1)
                {
                    iNo = i;
                    callback0 = callback1;
                }

                public void DoWork()
                {
                    MessageBox.Show(iNo.ToString());
                    if (callback0 != null)
                    {
                        callback0(iNo + 10);
                    }

                }

             }
        }
    }


    請關心自己的問題,不要問了就放空;這是對別人與自己的尊重
    2009年7月14日 上午 05:16
    版主
  • public delegate void myCallback(int i); <-  這段和下面
    ......
    ......
    class Work1
            {
                private myCallback callback0;
                private int iNo;
                public Work1(int i,myCallback callback1)   <- 看不太懂這段和上面的委派是怎麼用的? 不太懂這裡的意思  能不能解釋一下~感謝....
                {
                    iNo = i;
                    callback0 = callback1;
                }

                public void DoWork()
                {
                    MessageBox.Show(iNo.ToString());
                    if (callback0 != null)
                    {
                        callback0(iNo + 10);
                    }

                }
    }



    1.因為我是用主控台程式用return的方式寫回傳資料 可能要更深入了解我才會寫~所以想問清楚一點
    2.之前我有問過立即設定的問題~想問一下如果我用執行緒的方法呼叫~能達到這樣的功能嗎?
    2009年7月14日 上午 07:08
  • 委派在這邊不過就是把
    public void ReturnCode(int i)
            {
                MessageBox.Show("回傳" + i.ToString());
            }
    這個function 傳給次執行緒去呼叫
    所以當執行到 callback0(iNo + 10); 這邊,實際上就等於在主執行緒呼叫 ReturnCode(2+10)

    你的立即設定的問題和這個並不一樣
    這個問題基本上是同一個Application Domain中的執行緒互傳
    那個問題是兩個 Application Domain 中不同的Application 互傳

    請關心自己的問題,不要問了就放空;這是對別人與自己的尊重
    2009年7月14日 上午 07:22
    版主
  • 簡單的說,就是FunctionPoint.將主程式的Method插到Thread裡.當Thread執行到該點,就會將執行點回呼到UI主程式的Method裡.
    而上面的程式有一點需要注意的.就是BackThread要將結果送回到UIThread要做
             this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate()
                        {
                        });

    動作.這是WPF的寫法.其他的你們要去查一下文件.

    2009年7月14日 上午 07:35