使用RichTextBox调用问题

时间:2018-05-24 16:18:05

标签: c# .net async-await task-parallel-library

我使用任务并行库在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;
}

0 个答案:

没有答案