C# Cross-Thread de communication

dans C#.NET j'ai écrit l'arrière-plan simple thread de travail:

public class MyBackgrounder
{
public delegate void dlgAlert();
public dlgAlert Alert;
public event EventHandler eventAlert;
Thread trd;
public void Start()
{
if (trd == null || trd.ThreadState == ThreadState.Aborted)
{
trd = new Thread(new ThreadStart(Do));
}
trd.IsBackground = true;
trd.Priority = ThreadPriority.BelowNormal;
trd.Start();
}
void Do()
{
Thread.Sleep(3000);
Done();
}
void Done()
{
if (Alert != null)
Alert();
if (eventAlert != null)
eventAlert(this, new EventArgs());
Kill();
}
public void Kill()
{
if (trd != null)
trd.Abort();
trd = null;
}
}
static class Program
{
[STAThread]
static void Main()
{
MyBackgrounder bg = new MyBackgrounder();
bg.eventAlert += new EventHandler(bg_eventAlert);
bg.Alert = jobDone;
bg.Start();
}
static void bg_eventAlert(object sender, EventArgs e)
{
//here, current thread's id has been changed
}
static void jobDone()
{ 
//here, current thread's id has been changed
}
}

Il attends 3 secondes (fait son travail) et puis la soulève d'un événement ou d'appeler un délégué. il n'y a pas de problème jusqu'ici et tout fonctionne bien. Mais quand j'ai regarder le " Fil.CurrentThread.ManagedThreadId' , je vois que c'est le thread d'arrière-plan! c'est peut-être normal , mais comment puis-je éviter ce problème? si vous testez le " Système.De Windows.Les formulaires.Minuterie composante "et de gérer sesTique de l'événement , vous pouvez voir que le" Fil.CurrentThread.ManagedThreadId' a pas été modifié à partir de principal de l'Id de thread pour rien d'autre.

que puis-je faire?

Il n'y a pas de problème dans votre code et vous voulez juste de comprendre, non? Le backgroundworker dans un autre thread. Où avez-vous regarder l'id de thread?
Système.De Windows.Les formulaires.Minuterie utilise en interne le Windows WM_TIMER événement et simplement compte du nombre de tiques, puis la soulève le .NET de l'événement. Par conséquent, il peut travailler dans le thread principal de processus. L'arrière-plan travailleur, vous ont écrit des œuvres dans le thread d'arrière-plan (explicitement par la création de nouveaux Thread()), overwise le Fil.Sleep(3000) serait de suspendre l'intégralité de votre application. Quel est le problème de cette exécution dans le thread d'arrière-plan exactement?
lorsque l'arrière-plan travailleur objet soulève son événement ou les appels de la méthode spécifiée, là, je vois que le changement de l'id de thread. cela signifie que mon fond travailleur a appelé ces méthodes.
Thats droit, les méthodes appelées ne sont pas dans le contexte de thread de travail, mais dans le fil qui fournit ces rappels.
Merci. Je veux résoudre (changer) le fond de travailleur comportement , donc je l être sûr, plus tard, l'interaction des éléments de l'INTERFACE. il semble que je dois écrire le Document d'information à l'aide de native Win Api, tout comme .NET de la Minuterie, non? mais la façon dont il fonctionne de façon indépendante de la classe sans l'aide de fils!?

OriginalL'auteur losingsleeep | 2012-06-30