none
thread RRS feed

  • 問題

  • 我想請問個問題是,我該如何在程式啟動時就啟動多執行序,也就是默默的在背後執行,

    我是否可以寫在 Program.cs 檔案中?

    這樣我就可以利用程式執行時去做其他的事情,且不要影響到使用者,有點類似 service,

    但是我希望他在程式關閉時就結束工作,並緩衝關閉,避免關閉影響到資料不正確。


    努力學習

    2012年5月11日 上午 08:11

解答

  • 剛剛測試了一下, 發現我前面的說法有誤, 照理說應該會執行才對.

    以下是我用 Visual Basic 寫的測試程式碼

    Public Class Form1
    	Private Delegate Sub d()
    
    	Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    		Dim myTimerCallBack As Threading.TimerCallback
    		Dim t1 As Threading.Timer
    		myTimerCallBack = AddressOf TimerInvokeMethod01
    		t1 = New Threading.Timer(myTimerCallBack, Nothing, 5000, 10000)
    	End Sub
    
    	Private Sub TimerInvokeMethod01(ByVal state As Object)
    		Dim t As New Threading.Thread(AddressOf SubThreadMethod)
    		t.IsBackground = True
    		t.Start()
    	End Sub
    
    	Private Sub SubThreadMethod()
    		Dim x As New d(AddressOf ChangeText)
    		Me.Invoke(x)
    	End Sub
    
    	Private Sub ChangeText()
    		Label1.Text = DateTime.Now.ToString("HH:mm:ss.fffffff")
    	End Sub
    End Class
    [補充] 是不是你的 AutoResetEvent 把 Thread 給 Block 住了 ? 因為沒看到你把這個東西是放在哪邊設定


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2012年5月16日 上午 07:20
    版主

所有回覆

  • 1.可

    2.應該用全域變數去控制就行了,例如設一個全域的布林值。每條thread都會讀取這個值,當它為false時thread就跳出while迴圈


    2012年5月11日 上午 08:18
  • 1.可

    2.應該用全域變數去控制就行了,例如設一個全域的布林值。每條thread都會讀取這個值,當它為false時thread就跳出while迴圈


    可以多給我一些資訊嗎?

    如果我想設定 每十五分鐘執行 不使用timer 也可以嗎?


    努力學習

    2012年5月11日 上午 08:38
  • 您好

    為什麼不想使用 Timer ? Timer 有三種,都不想用嗎?

    三種時間人《.NET中的Timer(1)》

    三種時間人《.NET中的Timer(2)》

    三種時間人《.NET中的Timer(3)》


    歡迎參觀我的Blog.NET菜鳥自救會

    2012年5月11日 上午 09:19
  • 您好

    為什麼不想使用 Timer ? Timer 有三種,都不想用嗎?

    三種時間人《.NET中的Timer(1)》

    三種時間人《.NET中的Timer(2)》

    三種時間人《.NET中的Timer(3)》


    歡迎參觀我的Blog.NET菜鳥自救會

    哈...其實是不了解 如果了解哪有不用的道理^O^ 今晚研究~"~#

    努力學習

    2012年5月11日 上午 09:53
  • 隨著主程式結束就關閉的話, 要把 Thread.IsBackground 屬性設為 True 即可.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年5月11日 下午 03:23
    版主
  • 目前我程式的規劃如下

    我的想法是 當程式啟動時 30秒後 每半小時執行一次回傳資料給伺服器

    並判斷目前電腦CPU是否忙碌 小於50就執行 回傳工作

    我是否可以用多執行緒去執行回傳工作?我該如何去拆回傳工作 這部分我還不太懂

    //程式啟動

    static class Program
        {

    static void Main()
            {
                //背景工作
                ThreadWork.Run();

            }

        }

       public class ThreadWork
        {

            public static void Run()
            {
                TimerCallback TCB = BackgroundWork;
                AutoResetEvent ARE = new AutoResetEvent(false);
                //30秒後每半小時執行一次
                Timer BackGroundWorkTimer = new Timer(TCB, ARE, 30000, 1800000);
            }

            static void BackgroundWork(object arg)
            {
                //在背景執行緒處理的工作

                //CPU使用率小於50才執行傳送資料到伺服器
                if (SystemInfo.CPUTotalUsed < 50)
                {
                    //傳送資料給伺服器
                    TransferToServer();
                }
            }

            static void TransferToServer()
            {
                //背景傳送資料給伺服器

            }

        }


    努力學習

    2012年5月15日 上午 03:36
  • 當然可以用 Thread 回傳資料, 不過『拆』是什麼意思 ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年5月15日 下午 12:26
    版主
  • 當然可以用 Thread 回傳資料, 不過『拆』是什麼意思 ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    我指拆的意思是

    我Thread 寫在 TransferToServer() 內就可以與否?

    因為我有很多資料需要傳到伺服器

    是不是每個工作都要做一次

    怎樣避免相同的工作未執行完重複執行

    我是否可以定義Thread name判斷 ?


    努力學習

    2012年5月16日 上午 01:14
  • 我Thread 寫在 TransferToServer() 內就可以與否? <--可以啊

    避免重複執行, 你可以為每個 Job 給定一個 Boolean 變數或屬性, 當該工作執行前則判斷此 Boolean 值. 若為 False, 則執行工作, 並將此值設為 True, 當工作結束則將此值設為 False


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年5月16日 上午 04:16
    版主
  • //程式啟動時

        static class Program
        {

            static void Main()
            {
                //執行多執行緒以及背景工作
                ThreadWork.Run();

            }

        }

    //多執行緒 與 重複時間設定

        public class ThreadWork
        {

            public static void Run()
            {
                TimerCallback TCB = BackgroundWork;
                AutoResetEvent ARE = new AutoResetEvent(false);
                //30秒後每十分鐘執行一次
                Timer BackGroundWorkTimer = new Timer(TCB, ARE, 30000, 600000);
            }

            static void BackgroundWork(object arg)
            {
                //CPU使用率小於50才執行傳送資料到伺服器
                if (SystemInfo.CPUTotalUsed < 50)
                {
                    //在背景執多行緒處理的工作 
                    BackGroundWorks.Run();                              
                }
            }

            public static void MultipleThreads(string TreadName, ThreadStart TS)
            {
                Thread ThreadTask = new Thread(TS);
                ThreadTask.Name = TreadName;
                ThreadTask.IsBackground = true;
                ThreadTask.Start();
            }
        }

    //程式背後工作

        public class BackGroundWorks
        {
            public static void Run()
            {

    //多執行緒工作1

      ThreadWork.MultipleThreads("InsertLoginLog", InsertLoginLog);
            }

        }

    我想請問我這樣寫 怎麼30秒到了卻不會執行 如果我要下判斷是否工作已經執行未完成 
    是要加在以下的方法內嗎?目前卡關卡很久 debug 看不出他是否有動作~"~

    ThreadWork.MultipleThreads("InsertLoginLog", InsertLoginLog);


    努力學習

    2012年5月16日 上午 05:32
  • 因為你的 BackGroundWorks 所在的Thread 是背景執行緒, 而它的上層是由 Threading.Timer 所啟動的 Thread 中的 BackgroundWork 方法呼叫.

    問題來了, 你在以下方法中

    static void BackgroundWork(object arg)
            {
                //CPU使用率小於50才執行傳送資料到伺服器
                if (SystemInfo.CPUTotalUsed < 50)
                {
                    //在背景執多行緒處理的工作 
                    BackGroundWorks.Run();                              
                }
            }

    執行完   BackGroundWorks.Run();     這個 Threading.Timer 所啟動的執行緒就結束了, 意即 MultipleThreads 中的 ThreadTask 上層就消失了, ThreadTask就跟著消失.

    有幾種方法可以做

    (1) 在 BackGroundWorks.Run();   這一行後方加上 WaitHandle, 等到 ThreadTask所委派的方法結束後再將 WaitHandle 設定為收到信號的狀態以結束此 Method

    (2) 將 ThreadTask 委派回 主Thread 去呼叫

    (3) 用 Thread.Join 方法


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年5月16日 上午 06:01
    版主
  • 因為你的 BackGroundWorks 所在的Thread 是背景執行緒, 而它的上層是由 Threading.Timer 所啟動的 Thread 中的 BackgroundWork 方法呼叫.

    問題來了, 你在以下方法中

    static void BackgroundWork(object arg)
            {
                //CPU使用率小於50才執行傳送資料到伺服器
                if (SystemInfo.CPUTotalUsed < 50)
                {
                    //在背景執多行緒處理的工作 
                    BackGroundWorks.Run();                              
                }
            }

    執行完   BackGroundWorks.Run();     這個 Threading.Timer 所啟動的執行緒就結束了, 意即 MultipleThreads 中的 ThreadTask 上層就消失了, ThreadTask就跟著消失.

    有幾種方法可以做

    (1) 在 BackGroundWorks.Run();   這一行後方加上 WaitHandle, 等到 ThreadTask所委派的方法結束後再將 WaitHandle 設定為收到信號的狀態以結束此 Method

    (2) 將 ThreadTask 委派回 主Thread 去呼叫

    (3) 用 Thread.Join 方法


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    這位前輩 我目前腦袋已經進入 死結狀態
    你這樣說 我有點不懂 我的架構是否有錯誤

    我的用意是每十分鐘執行 也是說目前我要進入 背景工作就不會執行下去的意思嗎?

    還是說 Thread Timer 驅動的執行去 只能執行一層 因為我的想法是未來我會有很多 不同的工作希望 每十分鐘執行一次

    所以我的想法是 每十分鐘執行一次 然後分多執行緒 去做很多事情?


    努力學習

    2012年5月16日 上午 06:35
  •            

    public static void Run()

           {

                TimerCallback TCB = BackgroundWork;
                AutoResetEvent ARE = new AutoResetEvent(false);
                //30秒後每十分鐘執行一次
                Timer BackGroundWorkTimer = new Timer(TCB, ARE, 30000, 600000);
            }

    改寫成

    public static void Run()
            {
               TimerCallback TCB = BackgroundWork;
                //30秒後每十分鐘執行一次
                Timer BackGroundWorkTimer = new Timer(TCB);
                BackGroundWorkTimer.Change(10000, 5000);
            }

    就會固定時間重複 我想請問 AutoResetEvent 是甚麼意思= =? (不要揍我)

    我為了怕工作重複執行 以及 死結的問題是否只要改寫

    public static void MultipleThreads(string TreadName, ThreadStart TS)
            {
                Thread ThreadTask = new Thread(TS);
                ThreadTask.Name = TreadName;
                ThreadTask.IsBackground = true;
                ThreadTask.Start();
            }

    每次產生新的工作時要做判斷與防呆


    努力學習


    • 已編輯 Open1008 2012年5月16日 上午 07:20 修改
    2012年5月16日 上午 07:18
  • 剛剛測試了一下, 發現我前面的說法有誤, 照理說應該會執行才對.

    以下是我用 Visual Basic 寫的測試程式碼

    Public Class Form1
    	Private Delegate Sub d()
    
    	Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    		Dim myTimerCallBack As Threading.TimerCallback
    		Dim t1 As Threading.Timer
    		myTimerCallBack = AddressOf TimerInvokeMethod01
    		t1 = New Threading.Timer(myTimerCallBack, Nothing, 5000, 10000)
    	End Sub
    
    	Private Sub TimerInvokeMethod01(ByVal state As Object)
    		Dim t As New Threading.Thread(AddressOf SubThreadMethod)
    		t.IsBackground = True
    		t.Start()
    	End Sub
    
    	Private Sub SubThreadMethod()
    		Dim x As New d(AddressOf ChangeText)
    		Me.Invoke(x)
    	End Sub
    
    	Private Sub ChangeText()
    		Label1.Text = DateTime.Now.ToString("HH:mm:ss.fffffff")
    	End Sub
    End Class
    [補充] 是不是你的 AutoResetEvent 把 Thread 給 Block 住了 ? 因為沒看到你把這個東西是放在哪邊設定


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2012年5月16日 上午 07:20
    版主
  • AutoResetEvent 被這卡住了~"~#
    謝謝 Bill Chung


    努力學習

    2012年5月16日 上午 10:12