2016-12-30 101 views
0

我試圖做一個計時器的東西在一個循環中,定時器完成其工作後,應用程序啓動的循環另一個輪阻塞主線程。但是因爲我不知道如何在定時器運行時要求主線程停止運行,主線程立即進入下一個轉向。要在一個定時器運行C#

我做了一些關於鎖。

這是循環

for (int i = 0; i < step; i++) 
{ 
    Monitor.Enter(locker); 
    //start timer 
} 

則定時器

t_tick = (senders, args) => 
{ 

    if (condition) 
    { 
     //do something 
    } 
    else 
    { 
     //do something 
     Monitor.Exit(AirplaneManager.locker); 
     t.Stop(); 
    } 
}; 
t.Tick += t_tick; 
t.Interval = 30; 
t.Start(); 

內部的代碼,但在代碼運行到監視器計時器這給了我一個例外:對象的同步方法被調用來自一個不同步的代碼塊。

有沒有解決方法?或者我可以用其他方式實現我的目標?

謝謝!

+4

這是什麼類型的應用程序?一個命令行應用程序?的WinForms? WPF?其他?如果你想讓你的主線程阻塞,那你爲什麼還需要另一個線程呢? –

+0

對不起,我只使用Java,但這看起來非常類似於我在那裏的問題 - 在java中,我將一個synchronized()塊圍繞着Monitor.enter()... C#是否有類似的構造? –

+0

WindForms。例如,代碼行A,Timer.Start(),代碼行B.我希望應用程序只能在完成定時器運行時纔開始在B行運行。 –

回答

1

如果你想在當前線程阻塞的一組時間跨度,您可以只使用了Thread.Sleep(時間跨度) https://msdn.microsoft.com/en-us/library/274eh01d(v=vs.110).aspx

你並不需要使用另一個線程。

+0

這不是一個完整的線程的東西。我認爲計時器有時可以看作是一個線程,但在我的想象中,它是主線程的一部分,所以我最初的設計是當它運行時,主要應該等到它停止。 –

+0

我一直將c#定時器視爲異步執行重複(或基於間隔)操作的機制。但是如果你想阻塞主線程直到定時器完成 - 你可以: 有主線程等待一個: https://msdn.microsoft.com/en-us/library/58195swd.aspx 並且有定時器會在完成時標記waithandle(在msdn頁面上有一個例子) – Assaf

+0

如何鎖定定時器?只需使用lock關鍵字來鎖定一個對象並使括號圍繞定時器? –

相關問題