2010-11-01 100 views
0

嗨 我有一個計時器控制我的主窗體上創建一個類的實例,在某些情況下類的方法需要停止計時器。訪問窗體控件​​從類C#窗體

有沒有辦法將定時器Enabled屬性設置爲false而不通過控制進入方法?

我可以怎麼檢查計時器的mainform上的所有控件,然後禁用它?

+0

設計聽起來有點怪怪的 - 這可能是值得向大家解釋了更廣闊的背景你試圖達到什麼樣的目標,並要求提供如何簡化的建議 - 這將是最好的問題在一個單獨的問題 – 2010-11-01 11:47:13

回答

0

您可以從類中創建一個事件來停止定時器,並在您希望發生此事時將其提升。從外部類(主窗體)啓動類後,您訂閱該事件並停止處理程序中的計時器。

這是怎麼引發事件:

class Class1 
{ 
    public event EventHandler StopTimer; 

    public void SomeMethod() 
    { 
     if (StopTimer != null) 
      StopTimer(this, EventArgs.Empty); 
    } 

} 

這就是你必須在主窗體:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Class1 myClass = new Class1(); 
     myClass.StopTimer += new EventHandler(myClass_StopTimer); 

     timer1.Enabled = true; 
     timer1.Start(); 
    } 

    void myClass_StopTimer(object sender, EventArgs e) 
    { 
     timer1.Stop(); 
     timer1.Enabled = false; 
    } 
} 
1

我有這個類有一個構造函數,要麼需要一個接口

interface IStopTimer 
{ 
    void StopTimer(); 
} 

class MyClass 
{ 
    public MyClass(IStopTimer stopTimer) 
    ... 

或委託

class MyClass 
{ 
    public MyClass(Action stopTimer) 
    ... 

或可能計時器的方法來達到同樣的事情。這樣這個類不依賴於Windows窗體,並且不知道你用於定時器的是什麼。

+0

嗨Yuriy,謝謝,你可以告訴我新的C#...我不知道如何實現你在暗示什麼,你想介紹一下如何做到這一點? – Adrian 2010-11-01 13:02:36

+0

我可以,我應該使用Mutex嗎?或者這是矯枉過正? – Adrian 2010-11-01 13:06:23

0

這樣或那樣的方法將需要一個引用(直接或間接)的計時器來停止它。你可以對它抽象層,但它不會很漂亮。

您可以使用類似ThreadPool.QueueUserWorkItem()而不是定時器來啓動計時器執行的操作嗎?這樣當操作完成後,線程將返回到池中,並且您有一個「即忘即忘」機制。

+0

謝謝尼爾,在正常情況下,定時器運行exery x分鐘並更新表單上的項目負載。 – Adrian 2010-11-01 13:00:44

+0

但是,爲什麼定時器觸發的方法需要停止定時器? – 2010-11-01 13:49:01

+0

它不是定時器觸發的事件,基本上如果定時器事件之間發生某些事情,定時器事件將與之交互,我想停止定時器。 – Adrian 2010-11-02 21:48:19