Вызвать проблему, используя RichTextBox - PullRequest
0 голосов
/ 24 мая 2018

Я создал приложение блокнота в 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;
}
...