Tråd programmering
Nå, jeg kommer lige med et sikkert simpelt spørgsmål.Der er laaang tid siden jeg har lavet winforms programmering og støder derfor ind i sikkert lidt basis fejl.
Mit setup er : (dette eksempel er selvfølgelig dummy kode, men afspejler den logik som fejler)
Jeg har lavet en winforms applikation som anvender nogle services. f.eks. 'service1'.
På service1 har jeg lavet følgende eventHandler :
public event StatusEventDelegate.EventHandler StatusUpdate;
'form1' har så en Label kaldet 'lb_status'. Denne viser status for hvad min service laver.
'form1' subscriber så til dette event og sørger for at opdatere 'lb_status' med noget info/status beskeder.
Dette virker super godt, så længe det hele kører i en tråd. Men lige så snart man begynder at starte en ny tråd og i den nye tråd kalder en metode på 'service1', så får man en krydstråds exception når servicen invoker en status update.
Så mit spørgsmål er :
Der må næsten findes en nem måde at få status opdateringslogikken til at køre i hoved tråden selvom den bliver invoked fra en anden tråd.
Det er selvfølgelig ikke et problem i en consol app, men nedenstående konsol kode viser meget godt setup'et. Kan det på en nem måde lade sig gøre at få 'Service1_statusupdate' metoden til at skifte til hoved tråden.
Service1 service1 = new Service1();
service1.StatusUpdate += Service1_StatusUpdate;
void Service1_StatusUpdate(object? sender, EventArgs e)
{
Console.WriteLine($"This update was made from thread : {Thread.CurrentThread.ManagedThreadId}");
// i en winforms ville følgende linie fejle :
// lb_status.Text = "Hello World";
}
Console.WriteLine($"Current Thread name is : {Thread.CurrentThread.ManagedThreadId}");
Task.Factory.StartNew(() =>
{
service1.MyMethod();
});
Console.WriteLine("Completed");
Console.ReadLine();
public class Service1
{
public event EventHandler StatusUpdate;
public void MyMethod()
{
Thread.Sleep(1000);
StatusUpdate?.Invoke(this, new EventArgs());
}
}