2016-04-04 15 views
0

läuft Ich möchte jemand von Ihnen fragen, wenn Sie diese Art von Szenario versucht haben. Ich habe eine Windows-Anwendung in C# entwickelt. Im Hauptprogramm (Program.cs) habe ich einen Thread-Mutex hinzugefügt, nur um viele Operationen auszuführen, die unter ihm ausgeführt werden.System.Windows.Forms Timer funktioniert nicht, wenn ein Thread auf Haupt

//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() 
    } 

Und auf meiner anderen Formular FormOneInstance Klasse, habe ich System.Windows.Forms Timer

private void timer1_Tick(object sender, EventArgs e) 
     { 

      ShowSummary(); 
     } 

Jetzt will ich den Faden in Haupt- und UI trennen. Danke!

+1

Sie benötigen Nachrichtenschleife für diesen Timer ... Beachten Sie, dass es wirklich unklar ist, warum Sie diesen Timer für Konsolenanwendung holen ... und welcher Code mit ' mutex.WaitOne sollte darstellen. Es kann eine gute Idee sein, [MCVE] Anleitung zu lesen, um die Frage zu verbessern. –

+0

Dies ist keine Konsolenanwendung. Warum wird eine Nachrichtenschleife benötigt? – Juran

+0

Mutexe sind ein Synchronisationsmechanismus für zwei oder mehr Threads, um gleichzeitig auf eine freigegebene Ressource zuzugreifen. Ich sehe nicht, dass der Mutex von mehr als einem Thread verwendet wird und ich sehe nicht, welche Ressource synchronisiert wird. Wenn timer1_Tick verwendet wird, um den Fortschritt/die Ergebnisse des anderen Threads anzuzeigen, ist es wahrscheinlich nicht so einfach. Kennen Sie Hintergrundarbeiter? – user34660

Antwort

1

Der Windows Forms Timer läuft auf dem ui-Thread und es gibt nur einen siehe this SO post.

Siehe zum Beispiel die Threading.Timer auf MSDN

Sie können einen Timer verwenden, die dieses Zeug nicht. aber sicher sein, zurück, zu dem UI-Thread aufruft, wenn der Timer-Code will Werte ändern, die in der ui

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

Dann gezeigt werden, können Sie eine Methode erstellen, die Ihre CreateInputOutput Methode auf dem UI-Thread ruft in um ein neues Element 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 
} 

}

für weitere Einzelheiten zeigen auch diesen Beitrag über threading timer