none
C# 延時 請教 RRS feed

  • 一般討論

  • 剛學不久  在網路上找了些相關資訊

    有stopwatch .. sleep... timer.. GetTickCount .. TimeGetTime.. 以及QueryPerformanceCounter ..等等

    我想做一個class自訂義延時的幾個判斷Method

    好讓我需要DelayTime的時候可以呼叫出來使用

    例如 我要延遲200ms

    SetTime(200);  // 將要延遲的時間丟入method 開始執行200ms

     // 200ms 到了之後 MessageBox.Show("200ms完成");

    如何不占用CPU資源來完成

    單純利用時間差來判斷
    請問我該怎麼做...

    抱歉我爬文都大略看了一下也親自下去寫了一趟

    但還是搞不太懂 麻煩前輩們了


    2019年6月7日 下午 02:28

所有回覆

  • 用 Task.Delay 比較乾脆

    參考  https://docs.microsoft.com/zh-tw/dotnet/api/system.threading.tasks.task.delay?view=netframework-4.8#System_Threading_Tasks_Task_Delay_System_Int32_

    https://dotblogs.com.tw/howard/2013/06/06/105325


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

    2019年6月7日 下午 03:36
    版主
  • 你得先說說你允許的誤差是怎樣。

    一般是 +10ms


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

    2019年6月7日 下午 03:54
  • 前輩你好謝謝你的回覆

    關於這個Task.Delay 剛剛看了一下頗深的對於我..

    我花個時間看完再將心得回覆給您

    2019年6月7日 下午 05:49
  • 誤差其實不是需要狠準確

    我想要做一個

    例如

    我現在要讓馬達移動 ..  移動到位置後  ..  等待0.1秒..  0.1秒後判斷有無到位置..

    我想寫個新的class將delay的判斷寫入...但不引響cpu的執行

                                                               var a = 現在時間 + 0.1秒;

    我想說   等待0.1秒的做法是 > 抓取現在時間 >   if( a  == 現在時間(當下時間,所以是需要一直跑..跑到符合 a為止)) >繼續進行

    心情大..謝謝你的回覆小弟可能也表達得不是很清楚 我會努力的

    2019年6月7日 下午 05:56
  • 舉個簡單的例子,畫面上放了一個 Button 和兩個 Label ,為 Button1 的 Click event 掛上委派函式 (你必須要先注意到的是一個函式內部若是有使用 await 關鍵字,那函式本身要以 async 宣告。

        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            async private void button1_Click(object sender, EventArgs e)
            {
                label1.Text = DateTime.Now.ToString("HH:mm:ss");
                await Task.Delay(1000);
                label2.Text = DateTime.Now.ToString("HH:mm:ss");
            }
        }
    至於更深的東西,請參閱 https://docs.microsoft.com/zh-tw/dotnet/standard/parallel-programming/task-based-asynchronous-programming


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


    2019年6月8日 上午 03:33
    版主
  • 論壇有簽名檔功能。

    如果你精度要求不高,直接用 Sleep 就可以了,不用考慮 API 。

    https://docs.microsoft.com/zh-tw/dotnet/standard/threading/pausing-and-resuming-threads


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

    2019年6月8日 上午 04:27
  • Sleep會影響到其他的Thread...我是上網看其他人這樣寫的..所以我就沒用了
    2019年6月8日 下午 12:19
  • 謝謝大大  

    這方式我有去了解了

    但我將此用法寫在另一個class的method

    在form1去呼叫 class.methd (await Task.Delay(1000))  之後

    在form1的label上延遲1秒顯示label.text  好像行不通  還在找方式解決

    謝謝前輩

    2019年6月8日 下午 12:22
  •     public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            async private void button1_Click(object sender, EventArgs e)
            {
                label1.Text = DateTime.Now.ToString("HH:mm:ss");
                await MyClass.MyDelay(1000); 
                label2.Text = DateTime.Now.ToString("HH:mm:ss");
            }
    
            
        }
    
    
        public class MyClass
        {
            async public static Task MyDelay(int i)
            {
                await Task.Delay(i);
            }
        }


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

    2019年6月8日 下午 12:41
    版主
  • 問最後一個問題

    能夠不使用async 與 await 來執行嗎?

    例如這樣

    BILL大妳給個方向剩下小弟自行解決

    完成後會上來回覆您

    public static Task MyDelay(int i) {延時(i);

    // i 秒後跳出 執行.. }


    2019年6月8日 下午 01:07
  • BILL大

    我有想到一個方式

    用timeGetTime

    抓取"現在時間" 與 "要等待的時間" + "現在時間"

    var a = "現在時間" //需要每個秒或毫秒更新

    var b = "要等待的時間" + "現在時間"  //固定值

    public static voidMyDelay(int i) {

    var a = timeGetTime();

    var b = a + i ;

    if ( timeGetTime() == b)

    {

    跳出此涵式...

    } }

    .........我試過了我寫不太出來

    但應該這方式也可以, 利用時間差來判斷, 假如你要延遲2秒

    那我抓取現在時間+2秒

    假若 現在系統秒數為 10000 秒

    我要延時兩秒 就 if(現在時間 == 10002秒)

    就執行...

    晚點繼續摸索~~~

    2019年6月8日 下午 01:22
  • 你如果真的這麼不想用 async await,也可以寫成這樣

      public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
           private void button1_Click(object sender, EventArgs e)
            {
                label1.Text = DateTime.Now.ToString("HH:mm:ss");
                MyClass.MyDelay(1000);
                label2.Text = DateTime.Now.ToString("HH:mm:ss");
            }
    
            
        }
    
    
        public class MyClass
        {
            public static void MyDelay(int i)
            {
                var task = Task.Delay(i);
                task.Wait();
            }
        }


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

    2019年6月8日 下午 03:35
    版主
  • Sleep 不會影響其他執行緒,你應該以原廠的說明為準。

    我不知道你從哪裡看到,我猜會有這樣的誤解,應該是有人在 GDI Thread (通常 GDI Thread 是 Main Thread) 上呼叫 Sleep ,所有 Windows Callback 都是針對 hWnd / hDC 為主,這些都是靠 GDI Thread 建立與管理,若是在 GDI Thread 上呼叫 Sleep ,當然會影響到這個 Process 所轄的所有 Word Thread ,可以換種形容,所有同事靠 Server 交換檔案,你讓 Server 睡覺會怎樣。

    如果要在 GDI Thread 上呼叫 Sleep ,一般建議不要超過 500ms 。


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

    2019年6月8日 下午 03:35