Я создаю приложение блокнота в c # с использованием параллельной библиотеки задач. Но примерно через 2 секунды после ввода я получаю недопустимое исключение операции из-за перекрестных вызовов (проверка орфографии) или иногда также зависает пользовательский интерфейс.Может ли кто-нибудь показать мне лучший способ вызова моего метода GetRichTextbox?Проблема, которую я чувствую, где-то в методе GetRichTextBox ().
public RichTextBox GetRichTextBox()
{
Invoke(new MethodInvoker(delegate ()
{
RichTextBox rtb = null;
TabPage tp = tabControl1.SelectedTab;
if(tp!= null)
{
rtb = tp.Controls[0] as RichTextBox;
}
}));
return rtb;
}
public void spellchecker()
{
Invoke(new MethodInvoker(delegate ()
{
using (Hunspell hunspell = new Hunspell("en_us.aff", "en_US.dic"))
{
Parallel.ForEach(Regex.Matches(GetRichTextBox().Text, @"\w+").Cast<Match>(), match => {
string word = match.Value;
Font fnt = GetRichTextBox().Font;
Color color;
if (!hunspell.Spell(word))
{
fnt = new Font(fnt.FontFamily, fnt.Size, FontStyle.Underline);
color = Color.Red;
}
else
{
fnt = new Font(fnt.FontFamily, fnt.Size, FontStyle.Regular);
color = Color.Black;
}
GetRichTextBox().Select(match.Index, match.Length); // Selecting the matching word.
GetRichTextBox().SelectionFont = fnt; // Changing its font
GetRichTextBox().SelectionColor = color;
GetRichTextBox().SelectionStart =
GetRichTextBox().TextLength; // Resetting the selection.
GetRichTextBox().SelectionLength = 0;
});
}
}));
}
private void newtab()
{
TabPage tp = new TabPage("New Doc");
rtb = new RichTextBox();
rtb.HideSelection = false;
rtb.TextChanged += (bs, be) =>
{
Parallel.Invoke(
() => spellchecker(),
() => wordCount());
};
rtb.Dock = DockStyle.Fill;
tp.Controls.Add(rtb);
tabControl1.TabPages.Add(tp);
}