C# Threading.Suspendre dans Obsolète, le fil a été abandonné?
Dans mon application, j'effectue ma lecture du fichier par un autre thread(autres que le thread GUI). Il y a deux boutons qui permettent de suspendre et de reprendre le Fil respectivement.
private void BtnStopAutoUpd_Click(object sender, EventArgs e)
{
autoReadThread.Suspend();
}
private void BtnStartAutoUpd_Click(object sender, EventArgs e)
{
autoReadThread.Resume();
}
mais je suis face à cet avertissement,
Fil.Suspendre a été désapprouvée. Veuillez utiliser d'autres classes dans le Système.Threading, tel qu'un Moniteur, Mutex, de l'Événement, et un Sémaphore, pour synchroniser les Threads ou de protéger les ressources. http://go.microsoft.com/fwlink/?linkid=14202
Tout comment je cours seul thread (plutôt que de thread GUI), alors Comment puis-je appliquer la Synchronisation ici, ou du moniteur.
Code De Mise À Jour:
class ThreadClass
{
//This delegate enables asynchronous calls for setting the text property on a richTextBox control.
delegate void UpdateTextCallback(object text);
//create thread that perform actual task
public Thread autoReadThread = null;
public ManualResetEvent _event = new ManualResetEvent(true);
//a new reference to rich text box
System.Windows.Forms.RichTextBox Textbox = null;
private volatile bool _run;
public bool Run
{
get { return _run; }
set { _run = value; }
}
public ThreadClass(string name, System.Windows.Forms.RichTextBox r1)
{
Textbox = r1;
Run = true;
this.autoReadThread = new Thread(new ParameterizedThreadStart(UpdateText));
this.autoReadThread.Start(name);
}
private void UpdateText(object fileName)
{
//while (true)
//{
// _event.WaitOne();
while (Run)
{
if (Textbox.InvokeRequired)
{
UpdateTextCallback back = new UpdateTextCallback(UpdateText);
Textbox.BeginInvoke(back, new object[] { fileName });
Thread.Sleep(1000);
}
else
{
string fileToUpdate = (string)fileName;
using (StreamReader readerStream = new StreamReader(fileToUpdate))
{
Textbox.Text = readerStream.ReadToEnd();
}
break;
//}
}
}
}
}
}
run est bool valeur, un fil de contrôle(à l'origine de son vrai)
et démarrer le thread, je suis la création de cette instance de classe(ce début de thread également) dans d'autres classe
InvokeRequired est toujours vrai. Votre fils ne veut pas faire quelque chose d'utile, tout fonctionne sur le thread d'INTERFACE utilisateur.
OriginalL'auteur PawanS | 2010-12-22
Vous devez vous connecter pour publier un commentaire.
Noter que toutes les opérations soient terminées avant que le thread est "suspendu"
Ce que vous voulez
Avez-vous essayé d'utiliser
_event.Set()
? - Je définir l'état initial àfalse
sur leManualResetEvent
qui en fait attendre avant de continuerJe n'ai pas atteint. after_evenr.Wait (), j'ai écrit mon code pour obtenir l'exécution, mais attendez stmnt se bloque. _event.réinitialiser et _evenr.Jeu je l'ai écrit dans des événements de bouton.
Je serais personnellement la première ligne
ManualResetEvent _event = new ManualResetEvent(true);
, depuis le comportement par défaut devrait être pour l'exécution du thread.Correct. @Pawan Kumar: modification vrai dans le
ManualResetEvent
constructeur. Vérifier la mise à jour du code.OriginalL'auteur jgauffin
La raison de Suspendre et de Reprendre sont dépréciées est parce qu'il n'existe aucune garantie à ce point dans l'exécution du thread sera suspendu. C'est une mauvaise chose. Le problème est décrit ici ainsi que d'une solution.
La solution doit impliquer un WaitHandle (peut-être AutoResetEvent ou ManualResetEvent) que vous pouvez utiliser pour signaler à votre autoReadThread de démarrage/arrêt.
OriginalL'auteur Szymon Rozga
Je voudrais utiliser le Moniteur mécanisme pour la réalisation de la suspension et la reprise de threads. Le Moniteur.Attente en cause le fil d'attente pour le Moniteur.Pouls.
OriginalL'auteur Mas