Mon problème est si j'utilise multi-thread sur la même chaîne parfoisAccès à la même chaîne (StringBuilder) à l'aide multi-thread
la chaîne ne sera pas remplacer. (Je l'ai écrit ceci sur le bloc-notes si la syntaxe peut être
mal)
utilisant System.Thread ... D'autres ofcourse
class ....
{
private static StringBuild container = new StringBuilder();
static void Main(...)
{
container.Append(Read From File(Kind of long));
Thread thread1 = new Thread(Function1);
Thread thread2 = new Thread(Function2);
thread1.Start();
thread2.Start();
//Print out container
}
static void Function1
{
//Do calculation and stuff to get the Array for the foreach
foreach (.......Long loop........)
{
container.Replace("this", "With this")
}
}
//Same goes for function but replacing different things.
static void Function2
{
//Do calculation and stuff to get the Array for the foreach
foreach (.......Long loop........)
{
container.Replace("this", "With this")
}
}
}
maintenant quelque temps un élément ne soit pas remplacé. Donc, ma solution à cela appelle conteneur.Remplacer sur une autre méthode et faire un "verrou" qui fonctionne mais est-ce la bonne façon?
private class ModiflyString
{
public void Do(string x, string y)
{
lock (this)
{
fileInput.Replace(x, y);
}
}
}
Je n'ai jamais pensé à verrouiller le stringbuilder lui-même, très sympa. merci, –
Le deuxième exemple de Phil est ce dont je parle quand j'ai mentionné un objet "factice". Cependant, je pense que son premier exemple où il verrouille le conteneur est le meilleur de tous.Étant donné que le conteneur représente les données partagées entre les threads, vous souhaitez verrouiller cela. Si vous avez utilisé mon exemple, le problème est que si vous aviez des threads qui essayaient d'appeler ModifyString.Do pour des conteneurs totalement séparés, ils se bloqueraient les uns les autres, même si les conteneurs avec lesquels ils travaillent sont totalement différents. Donc, vous blesseriez la performance. Donc, mon exemple est vraiment une mauvaise implémentation. – AaronLS
merci @arronls maintenant mon programme fonctionne :) –