2012-04-13 8 views
2

Der Fehler, den ich von meinem Thread habe, ist:System Threading: Kreuzgewinde-Betrieb nicht gültig

Cross-Thread-Betrieb nicht gültig. Steuere 'richTextBox8', auf die von einem anderen Thread als dem Thread zugegriffen wird, auf dem es erstellt wurde.

Ich habe diesen Code, den ich für meine Liste der Zeichenfolge verwenden, die den Fehler verursacht.

string[] parts = richTextBox8.Text.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries); 

Jetzt arbeitet mit der Verwendung von System.Threading, dass der Code oben in ein Format, so etwas wie dieser Code zu verwandeln erfordern ich arbeite, aber ich bin nicht in der Lage, es zu tun oder gibt es eine andere Möglichkeit?

+4

Ihr zweites Codebeispiel (oder etwas sehr ähnlich wie es) ist, was Sie brauchen. Welches Problem bekommst du mit dem zweiten Code? – ChrisF

+0

Welcher Typ ist Ihre Textbox? Ich habe gelesen, dass einige Drittanbieter in diesem Szenario Probleme haben –

+0

Idealerweise sollten Sie 'richTextBox8.Text' greifen, bevor Sie die Thread-Operation starten - könnten Sie uns bitte mehr Kontext geben? –

Antwort

1
string[] parts = null; 
richTextBox8.Invoke((Action)(() => 
    { 
     parts = richTextBox8.Text.Split(new string[] { " " }, 
     StringSplitOptions.RemoveEmptyEntries); //added semicolon 
    })); 
+0

Funktioniert für mich! Vielen Dank! – guitarPH

2

Ihr String-Array (String []) sieht gut aus für mich. Wenn Whitespaces in RichTextBox8 vorhanden sind, sollte das Teilen erfolgen.

Ihr Threading Bezüglich versuchen, mit einem Einsatz von Delegierten, wie:

public delegate void MyDelegate(string message); 

    //when you have to use Invoke method, call this one: 
    private void UpdatingRTB(string str) 
    { 
     if(richTextBox8.InvokeRequired) 
      richTextBox8.Invoke(new MyDelegate(UpdatingRTB), new object []{ msg }); 
     else 
      richTextBox8.AppendText(msg); 
    } 
1

Sie müssen nur die Textextraktion auf dem UI-Thread getan.

Mit variable capturing:

string text = null; 
richTextBox8.Invoke((Action)(() => text = richTextBox8.Text)); 
string[] parts = text.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries); 

Ohne variable Capturing (etwas effizient):

var ret = (string)richTextBox8.Invoke((Func<string>)(() => richTextBox8.Text)); 
parts = ret.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries); 
+0

Funktioniert auch gut für meinen Code ... Danke! – guitarPH

+0

Gern geschehen. Beachten Sie, dass dies etwas effizienter ist als die von Ihnen gewählte Antwort, da Sie das Aufteilen des Benutzeroberflächen-Threads nicht vornehmen (in der Regel möchten Sie so viel wie möglich vom Benutzeroberflächen-Thread entfernen). –