BeginInvoke Problem


realpk

Mitglied
Du rufst doch das BeginInvoke von dem neuen Thread auf.
Somit läuft diese Methode ja dann asynchron zu dem neuen Thread.
Sprich synchron zu dem Hauptthread.

Aber wieso läuft der "Thread" / bzw. die Methode in meinem Fall nicht asynchron zu dem Mainthread?

Ich sage ja:

Hey Hauptthread rufe das Delegate/die Methode asynchron auf.

Code:
   public delegate void testdelegate();
           public void testmethode()
           {
               System.Threading.Thread.Sleep(100000);
           }    
   
           public void button1_Click(object sender, System.EventArgs e)
           {
               this.BeginInvoke( new testdelegate(testmethode));
           }
 

Alexander Schuc

crazy-weasel
Das BeginInvoke, Invoke etc. gibt es nur für die Fälle das du Methoden in einem anderem Thread (und zwar dem Thread der Controls) ausführen willst.

Wenn du im selben Thread BeginInvoke benutzt wirds nicht klappen, weil dafür ist es nicht da.
 

realpk

Mitglied
Ok danke, ich habe es nun etwas anders hinbekommen:

Code:
 public delegate void testdelegate();
 		public void testmethode()
 		{
 			System.Threading.Thread.Sleep(1000000);
 		}
 
 		public void button1_Click(object sender, System.EventArgs e)
 		{
 			testdelegate t = new testdelegate(testmethode);
 			t.BeginInvoke(null, null);
 			
 		}
 

Alexander Schuc

crazy-weasel
Tjo, so wie du es nun benutzt ist es ziemlich anders als in deinem vorherigen Code.
Hier benutzt du BeginInvoke am Delegate, zuvor hast du BeginInvoke vom Typ Control benutzt.
 

Freak2k

Erfahrenes Mitglied
die neue Variante ist aber die richtige!

Code:
private delegate string StartDelegate(string param);

public static void main(string[] args)
{
     //Legt den delegate auf die aufzurufende Methode
     StartDelegate start = new StartDelegate(workerMethod);
     //startet die methode in einem eigenen Thread (mit parameterübergabe)
     start.BeginInvoke("parameter 1",new AsyncCallback(afterWork),null);
}

//Der eigentliche Thread
private static string workerMethod(string param)
{
     Thread.Sleep(5000);
     return "Fertig";
}

//wird aufgerufen, wenn "workerMethod" fertig ist
private static void afterWork(IAsyncResult result)
{
     AsyncResult async = (AsyncResult)result;
     StartDelegate startDel = (StartDelegate)async.AsyncDelegate;
     //gibt die rückgabe von "workerMethod" aus
     Console.WriteLine(startDel.EndInvoke(result));
}