2016-04-04 93 views
0

如果您嘗試過這種方案,我想詢問您中的任何人。我在c#中開發了一個Windows應用程序。在主程序(Program.cs)中,我添加了一個線程互斥對象來執行多任務下的多個操作。System.Windows.Forms定時器在主線程上運行時不起作用

//under Program.cs 
public static FormOneInstance frmOneInstance; 
    static void Main() 
    { 
     t = new Thread(new ThreadStart(CreateInputOutput)); 
     t.Start(); 
    } 
    public static void CreateInputOutput() 
    { 
       try 
       { 
        mutex.WaitOne(); 
        ExecuteManyOperationsHere(); 
       } 
       finally 
       { 
        mutex.ReleaseMutex(); 
        Thread.CurrentThread.Abort(); //Has ThreadAbortException here 
        t = null; 
       } 
     } 



    public static void ExecuteManyOperationsHere() 
    { 
     frmOneInstance =new FormOneInstance(); //this has lot of execution on formLoad that includes ShowSummary() 
    } 

而且我的其他形式FormOneInstance類,我用System.Windows.Forms的定時器

private void timer1_Tick(object sender, EventArgs e) 
     { 

      ShowSummary(); 
     } 

現在,我想該線程在主和UI分開。 謝謝!

+1

您需要爲這個計時器消息循環......注意,你爲什麼挑選定時器控制檯應用程序,它真的不清楚......什麼代碼' mutex.WaitOne'應該代表。閱讀[MCVE]指導以改進問題可能是個好主意。 –

+0

這不是一個控制檯應用程序。爲什麼需要消息循環? – Juran

+0

互斥鎖是兩個或更多線程同時訪問共享資源的同步機制。我沒有看到多個線程正在使用互斥鎖,而且我也看不到正在同步哪個資源。如果使用timer1_Tick來顯示其他線程的進度/結果,那麼它不太容易。你是否熟悉後臺工作者? – user34660

回答

1

Windows窗體計時器在ui線程上運行,並且只有一個參見this SO post

例如,見Threading.Timer MSDN上

你可以使用一個定時器,沒有這個東西。但一定要調用回,到UI線程時,計時器代碼要改變在UI

myTimer= new Timer(handleTimer, null, timerIntervall, Timeout.Infinite); 

顯示值,則可以創建調用您的CreateInputOutput方法在UI線程上的方法爲了展現出新的UI元素

public void handleTimer(object State) 
{ 
// PLace here the blocking code which shoudl not block the ui 
this.invoke(...) // here you can call the method which should be run un the ui thread. Like creating new forms 
} 

}

更多細節也看到這個帖子約threading timer

相關問題