none
C# 關於邏輯處理與畫面顯示 RRS feed

  • 問題

  • 想請教各位大大關於畫面刷新的疑問

    我在Click 事件中寫

    textbox1.Text = "1";
    Thread.Sleep(2000);

    textbox2.Text  = "2";
    Thread.Sleep(2000);

    這樣的寫法會等4秒之後,畫面才看的到textbox1,textbox2的值

    可是我想要的是先顯示1在顯示2的這種先後順序感覺

    不知道這應該要怎麼處理,感覺這應該是很多人遇到過得問題

    有看過像是For Loop 顯示Label 的值 也是只會顯示Loop的最後一個值

    最後是以Timer的方式去寫

    可是現一些邏輯判斷而已,不知道有什麼方式或是關鍵字可以提供


    • 已編輯 open852134 2016年9月27日 上午 06:04
    2016年9月27日 上午 06:02

解答

  •  public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Thread t = new Thread(ShowText);
                t.IsBackground = true;
                t.Start();
            }
    
            private void ShowText()
            {
                this.Invoke(new Action(() => textBox1.Text = "1"));
                Thread.Sleep(2000);
                this.Invoke(new Action(() => textBox2.Text = "2"));
            }
        }

    多執行緒應用程式 (C# 和 Visual Basic)

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

    • 已標示為解答 open852134 2016年9月28日 上午 05:00
    2016年9月27日 下午 12:50
    版主

所有回覆

  • 1.使用動態產生控制項方式 依照資料的讀取來進行顯示

    2.你可以暫時隱藏控制項 等到timer兩秒後 控制項在顯示出來即可

    以上供參考

    2016年9月27日 上午 06:16
  • 我想是因為你把這些全塞在 UI 執行緒去做, 而沒有採用多執行緒模型.

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

    2016年9月27日 上午 06:29
    版主
  • 利用多執行續執行

    不知道有沒有範例

    我剛剛是這樣,還是一樣等了5秒才兩個一起顯示
    是執行寫法錯了嗎

    new Thread(delegate() { this.Invoke((EventHandler)(delegate { textBox1.Text = "1"; }));

    }).Start();

      Thread.Sleep(5000);
      textBox2.Text = "5";

    2016年9月27日 下午 12:36
  •  public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Thread t = new Thread(ShowText);
                t.IsBackground = true;
                t.Start();
            }
    
            private void ShowText()
            {
                this.Invoke(new Action(() => textBox1.Text = "1"));
                Thread.Sleep(2000);
                this.Invoke(new Action(() => textBox2.Text = "2"));
            }
        }

    多執行緒應用程式 (C# 和 Visual Basic)

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

    • 已標示為解答 open852134 2016年9月28日 上午 05:00
    2016年9月27日 下午 12:50
    版主
  • 喔!!

    是所有給值的部分都要丟到另一個執行續才會有效果喔!!

    可是如果Clieck裡面先寫

    textBox1.Text = "test";
    Thread.Sleep(2000);

    Thread t = new Thread(ShowText);
    t.IsBackground = true;
    t.Start();

    那"test"這個字串還是會直接被省略

    等兩秒之後會直接出現 "1"

    這是為什麼阿,怎麼不是先出現 "test" 然後過兩秒才出現 "1"

    不懂運行的先後順序是怎麼回事


    • 已編輯 open852134 2016年9月27日 下午 01:22
    2016年9月27日 下午 01:22
  • rule No.1 : 不要在 UI 執行緒使用  Thread.Sleep

    (註 1 : 我的程式碼沒有把 Thread Sleep 放在 UI 執行緒跑吧)

    (註 2 : 如果不懂, 就把我之前給你的 link 的文章, 以及文章裡的 link 的其他文章研讀幾次, 這世上沒有知識是可以一蹴可幾的, 要花的時間努力的, 好嗎)

    (註 3 : 論壇中有很多過去相關於執行緒的討論, 你也可以看一看 https://social.msdn.microsoft.com/Forums/zh-tw/home?sort=relevancedesc&brandIgnore=True&searchTerm=%E5%9F%B7%E8%A1%8C%E7%B7%92)


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


    2016年9月27日 下午 02:28
    版主
  • 想請教各位大大關於畫面刷新的疑問

    我在Click 事件中寫

    textbox1.Text = "1";
    Thread.Sleep(2000);

    textbox2.Text  = "2";
    Thread.Sleep(2000);

    這樣的寫法會等4秒之後,畫面才看的到textbox1,textbox2的值

    可是我想要的是先顯示1在顯示2的這種先後順序感覺

    不知道這應該要怎麼處理,感覺這應該是很多人遇到過得問題

    有看過像是For Loop 顯示Label 的值 也是只會顯示Loop的最後一個值

    最後是以Timer的方式去寫

    可是現一些邏輯判斷而已,不知道有什麼方式或是關鍵字可以提供


    範例:

            private async void button1_Click(object sender, EventArgs e)
            {
                textBox1.Text = "1";
                await Task.Delay(2000);
                textBox2.Text = "2";
            }

    請參考 使用 Async 和 Await 設計非同步程式 (C# 和 Visual Basic)
    2016年9月28日 上午 03:14
  • 感謝版主提供的資訊非常實用

    我會再多去爬文的,也感謝各位的回復

    2016年9月28日 上午 05:02
  • Task.Delay 與 Thread.Sleep 

    我在看一下倆著的差異,感謝大大回復!!

    2016年9月28日 上午 05:04
  • 你如果不會多緒,可以參考這篇來等待時間。

    VB6/VBNET CPU 資源釋出


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

    2016年9月28日 上午 08:10