BeginInvoke Problem

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));
           }
 
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.
 
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);
 			
 		}
 
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.
 
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));
}
 
Zurück