Я создал приложение блокнота в c #, используя параллельную библиотеку задач.Я пытаюсь реализовать проверку орфографии в моем приложении.У меня сейчас проблема в том, что
rtb.Select(match.Index, match.Length);
и
rtb.SelectionColor = color;
вызывается более одного раза.Следовательно, мой пользовательский интерфейс иногда зависает.Поэтому я применил асинхронное ожидание для части метода.rtb
- это объект RichTextBox.Есть ли другой способ, которым я могу обойти это.
public string spellchecker() {
string rb = string.Empty;
using(Hunspell hunspell = new Hunspell("en_us.aff", "en_US.dic")) {
Parallel.ForEach(Regex.Matches(GetRTBText(), @"\w+").Cast<Match>(), async match => {
string word = match.Value;
Color color;
if (!hunspell.Spell(word)) {
color = Color.Red;
} else {
color = Color.Black;
}
Invoke(new MethodInvoker(delegate() {
rtb.Select(match.Index, match.Length);
rtb.SelectionColor = color;
}));
string t = await Task.Run(() => ff());
Invoke(new MethodInvoker(delegate() {
rb = rtb.Text;
}));
});
}
return rb;
}
public string ff() {
string x = String.Empty;
Invoke(new MethodInvoker(delegate() {
rtb.SelectionStart = rtb.TextLength; // Resetting the selection.
rtb.SelectionLength = 0;
x = rtb.Text;
}));
return x;
}
public string GetRTBText() {
string text = string.Empty;
Invoke(new MethodInvoker(delegate() {
RichTextBox rtb = null;
TabPage tp = tabControl1.SelectedTab;
if (tp != null) {
rtb = tp.Controls[0] as RichTextBox;
}
text = rtb.Text;
}));
return text;
}