none
Thread使用時,程序停留... RRS feed

  • 問題

  • 在Button上點擊...

    Click > A > B(載入大量資料須等待) > C > Click程序結束

    因B段載入時間非常久表單會卡住所以需使用Thread續執行
    但若此段用Thread時,C段會在B段還在執行中就馬上被執行
    需求上是希望能在等待時表單能不要卡住,就可以讓程序先停留在B段等待處理完後再繼續處理C段

    2016年9月20日 上午 01:02

解答

  • 在Button上點擊...

    Click > A > B(載入大量資料須等待) > C > Click程序結束

    因B段載入時間非常久表單會卡住所以需使用Thread續執行
    但若此段用Thread時,C段會在B段還在執行中就馬上被執行
    需求上是希望能在等待時表單能不要卡住,就可以讓程序先停留在B段等待處理完後再繼續處理C段

    試試 async/await ?

            private async void Button_Click(object sender, RoutedEventArgs e)
            {
                DoA();
    
                await DoBAsyncTask();
    
                DoC();
            }
    
            private void DoA()
            {
                Console.WriteLine("A:" + DateTime.Now);
            }
    
            private Task DoBAsyncTask()
            {
                Console.WriteLine("B:" + DateTime.Now);
                return Task.Run(() =>
                {
                    Thread.Sleep(2000);
                });
            }
    
            private void DoC()
            {
                Console.WriteLine("C:" + DateTime.Now);
            }

    • 已標示為解答 Lin_even 2016年9月21日 上午 01:02
    2016年9月20日 下午 05:28

所有回覆

  • 2016年9月20日 上午 04:28
  • 若加上Join的話是可以達到讓執行緒繼續執行,但程序會先中斷,但是畫面就會卡主不動,等到執行緒執行完後畫面才能控制

    需要利用多執行緒來解決畫面卡卡的問題

    不知道還有沒有其他方式呢?

    2016年9月20日 上午 09:51
  • 為什麼不把 B 和 C 在同一個 Thread 執行呢 ?

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

    2016年9月20日 上午 10:36
    版主
  • A  與 C 都是 父類別上的東西

    B則是一個虛擬方法讓繼承者去實現


    2016年9月20日 下午 02:13
  • 1. 多緒

    B 以新執行緒啟動,無限迴圈在 主執行緒檢查 執行緒B 是否結束,否則 Sleep(1) 毫秒,直至執行緒 B 結束,跳出迴圈,開始執行 C

    2. 單緒 (需 B 為大量迴圈)

    在 B 評估迴圈不超過 100ms 設置,例如說迴圈每 100 次執行一次 Application.DoEvents / Sleep(1)

    則對視窗動作會在 DoEvents 後觸發。

    你可以看看這篇:

    VB6/VBNET CPU 資源釋出


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2016年9月20日 下午 02:48
  • 在Button上點擊...

    Click > A > B(載入大量資料須等待) > C > Click程序結束

    因B段載入時間非常久表單會卡住所以需使用Thread續執行
    但若此段用Thread時,C段會在B段還在執行中就馬上被執行
    需求上是希望能在等待時表單能不要卡住,就可以讓程序先停留在B段等待處理完後再繼續處理C段

    試試 async/await ?

            private async void Button_Click(object sender, RoutedEventArgs e)
            {
                DoA();
    
                await DoBAsyncTask();
    
                DoC();
            }
    
            private void DoA()
            {
                Console.WriteLine("A:" + DateTime.Now);
            }
    
            private Task DoBAsyncTask()
            {
                Console.WriteLine("B:" + DateTime.Now);
                return Task.Run(() =>
                {
                    Thread.Sleep(2000);
                });
            }
    
            private void DoC()
            {
                Console.WriteLine("C:" + DateTime.Now);
            }

    • 已標示為解答 Lin_even 2016年9月21日 上午 01:02
    2016年9月20日 下午 05:28
  • A  與 C 都是 父類別上的東西

    B則是一個虛擬方法讓繼承者去實現


    不就用個 Template Method 就解了嗎 ? (呼叫者呼叫 BAndC 就行啦)

     public class BaseClass
        {
            public void A()
            {
                
            }
    
            public void BAndC()
            {
                B();
                C();
            }
    
    
            protected virtual void B()
            {
    
            }
    
            public void C()
            {
    
            }
        }
    
        public class Class1 : BaseClass
        {
            protected override void B()
            {
                Thread.Sleep(1000);
            }
        }


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


    2016年9月20日 下午 06:42
    版主