我使用任务并行库在c#中创建了一个记事本应用程序。我正在尝试在我的应用程序上实现拼写检查。我现在遇到的问题是
rtb.Select(match.Index, match.Length);
和
rtb.SelectionColor = color;
被调用多次一次。因此我的UI有时会冻结。因此,我对该方法的一部分应用了异步等待。 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;
}