C# 代码的目标,但我会尝试以下内容: public class Parser { public Parser(string _text) { text = _text; } private string text { get; set; } public string[] find() { string r1 = "..."; string r2 = "..."; string r3 = "..."; string[] regArray = new string[] { r1, r2, r3 }; List<string> resL = new List<string>(); for (int i = 0; i < regArray.Length; i++) { MatchCollection matchList = Regex.Matches(text, regArray[i]); var list = matchList.Cast<Match>().Select(match => match.Value).ToList(); resL.AddRange(list); } string[] res = resL.Distinct().ToArray(); if (res.Length > 0) return res; return new string[0]; } } private async void FindButton_Click(object sender, RoutedEventArgs e) { FindButton.Content = "Searching..."; FindButton.IsEnabled = false; await Task.Delay(1); try { string parsed = string.Empty; if (string.IsNullOrWhiteSpace(new TextRange(InputField.Document.ContentStart, InputField.Document.ContentEnd).Text)) ; { OutputField.Document.Blocks.Clear(); MessageBox.Show("Empty input"); } else { Parser nOb = new Parser(new TextRange(InputField.Document.ContentStart, InputField.Document.ContentEnd).Text); string[] result = nOb.find(); if (result.Length == 0) { OutputField.Document.Blocks.Clear(); MessageBox.Show("Nothing found"); } else { for (int i = 0; i < result.Length; i++) { parsed += result[i] + Environment.NewLine; } OutputField.Document.Blocks.Clear(); OutputField.Document.Blocks.Add(new Paragraph(new Run(parsed))); MessageBox.Show("Success"); } } } catch (Exception ex) { MessageBox.Show("Error: " + ex.Message); } FindButton.Content = "Default"; FindButton.IsEnabled = true; }

C# 代码的目标,但我会尝试以下内容: public class Parser { public Parser(string _text) { text = _text; } private string text { get; set; } public string[] find() { string r1 = "..."; string r2 = "..."; string r3 = "..."; string[] regArray = new string[] { r1, r2, r3 }; List<string> resL = new List<string>(); for (int i = 0; i < regArray.Length; i++) { MatchCollection matchList = Regex.Matches(text, regArray[i]); var list = matchList.Cast<Match>().Select(match => match.Value).ToList(); resL.AddRange(list); } string[] res = resL.Distinct().ToArray(); if (res.Length > 0) return res; return new string[0]; } } private async void FindButton_Click(object sender, RoutedEventArgs e) { FindButton.Content = "Searching..."; FindButton.IsEnabled = false; await Task.Delay(1); try { string parsed = string.Empty; if (string.IsNullOrWhiteSpace(new TextRange(InputField.Document.ContentStart, InputField.Document.ContentEnd).Text)) ; { OutputField.Document.Blocks.Clear(); MessageBox.Show("Empty input"); } else { Parser nOb = new Parser(new TextRange(InputField.Document.ContentStart, InputField.Document.ContentEnd).Text); string[] result = nOb.find(); if (result.Length == 0) { OutputField.Document.Blocks.Clear(); MessageBox.Show("Nothing found"); } else { for (int i = 0; i < result.Length; i++) { parsed += result[i] + Environment.NewLine; } OutputField.Document.Blocks.Clear(); OutputField.Document.Blocks.Add(new Paragraph(new Run(parsed))); MessageBox.Show("Success"); } } } catch (Exception ex) { MessageBox.Show("Error: " + ex.Message); } FindButton.Content = "Default"; FindButton.IsEnabled = true; },c#,wpf,user-interface,freeze,C#,Wpf,User Interface,Freeze,我简化了您的解析器类: public class Parser { const string _r1 = "..."; private string _text; public Parser(string text) { _text = text; } public IEnumerable<string> Find() {

我简化了您的
解析器
类:

    public class Parser 
    {
        const string _r1 = "...";
        private string _text;

        public Parser(string text)
        {
            _text = text;
        }

        public IEnumerable<string> Find()
        {
            return Regex.Matches(_text, _r1)
                .Cast<Match>()
                .Select(match => match.Value)
                .Distinct();
        } 
    }

如果您能更好地指定代码的最终目标,我们可以更准确地提供帮助。

我必须承认,我不理解您代码的目标是什么,但我会尝试这样做:

public class Parser {
    public Parser(string _text)
    {
        text = _text;
    }

    private string text { get; set; }

    public string[] find()
    {

        string r1 = "...";
        string r2 = "...";
        string r3 = "...";

        string[] regArray = new string[] { r1, r2, r3 };

        List<string> resL = new List<string>();

        for (int i = 0; i < regArray.Length; i++)
        {
            MatchCollection matchList = Regex.Matches(text, regArray[i]);
            var list = matchList.Cast<Match>().Select(match => match.Value).ToList();
            resL.AddRange(list);
        }

        string[] res = resL.Distinct().ToArray();
        if (res.Length > 0)
            return res;
        return new string[0];
    } }

private async void FindButton_Click(object sender, RoutedEventArgs e) {
    FindButton.Content = "Searching...";
    FindButton.IsEnabled = false;
    await Task.Delay(1);

    try
    {
        string parsed = string.Empty;
        if (string.IsNullOrWhiteSpace(new TextRange(InputField.Document.ContentStart, InputField.Document.ContentEnd).Text)) ;
        {
            OutputField.Document.Blocks.Clear();
            MessageBox.Show("Empty input");
        }
        else
        {
            Parser nOb = new Parser(new TextRange(InputField.Document.ContentStart, InputField.Document.ContentEnd).Text);
            string[] result = nOb.find();

            if (result.Length == 0)
            {
                OutputField.Document.Blocks.Clear();
                MessageBox.Show("Nothing found");
            }
            else
            {
                for (int i = 0; i < result.Length; i++)
                {
                    parsed += result[i] + Environment.NewLine;
                }

                OutputField.Document.Blocks.Clear();
                OutputField.Document.Blocks.Add(new Paragraph(new Run(parsed)));

                MessageBox.Show("Success");
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Error: " + ex.Message);
    }

    FindButton.Content = "Default";
    FindButton.IsEnabled = true; 
}
我简化了您的
解析器
类:

    public class Parser 
    {
        const string _r1 = "...";
        private string _text;

        public Parser(string text)
        {
            _text = text;
        }

        public IEnumerable<string> Find()
        {
            return Regex.Matches(_text, _r1)
                .Cast<Match>()
                .Select(match => match.Value)
                .Distinct();
        } 
    }

如果您更好地指定代码的最终目标,我们可以更精确地提供帮助。

尝试在后台线程上执行
find()
方法:

private async void FindButton_Click(object sender, RoutedEventArgs e)
{
    FindButton.Content = "Searching...";
    FindButton.IsEnabled = false;

    try
    {
        if (string.IsNullOrWhiteSpace(new TextRange(InputField.Document.ContentStart, InputField.Document.ContentEnd).Text))
        {
            OutputField.Document.Blocks.Clear();
            MessageBox.Show("Empty input");
        }
        else
        {
            string[] result;
            await Task.Run(() =>
            {
                Parser nOb = new Parser(new TextRange(InputField.Document.ContentStart, InputField.Document.ContentEnd).Text);
                result = nOb.find();
            });

            if (result == null || result.Length == 0)
            {
                OutputField.Document.Blocks.Clear();
                MessageBox.Show("Nothing found");
            }
            else
            {
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < result.Length; i++)
                {
                    sb.AppendLine(result[i]);
                }

                OutputField.Document.Blocks.Clear();
                OutputField.Document.Blocks.Add(new Paragraph(new Run(sb.ToString())));

                MessageBox.Show("Success");
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Error: " + ex.Message);
    }

    FindButton.Content = "Default";
    FindButton.IsEnabled = true;
}
private async void FindButton_单击(对象发送方,RoutedEventArgs e)
{
FindButton.Content=“搜索…”;
FindButton.IsEnabled=false;
尝试
{
if(string.IsNullOrWhiteSpace(新文本范围(InputField.Document.ContentStart,InputField.Document.ContentEnd.Text))
{
OutputField.Document.Blocks.Clear();
MessageBox.Show(“空输入”);
}
其他的
{
字符串[]结果;
等待任务。运行(()=>
{
Parser nOb=new Parser(新的文本范围(InputField.Document.ContentStart,InputField.Document.ContentEnd.Text);
结果=nOb.find();
});
if(result==null | | result.Length==0)
{
OutputField.Document.Blocks.Clear();
MessageBox.Show(“未找到任何内容”);
}
其他的
{
StringBuilder sb=新的StringBuilder();
for(int i=0;i
尝试在后台线程上执行
find()
方法:

private async void FindButton_Click(object sender, RoutedEventArgs e)
{
    FindButton.Content = "Searching...";
    FindButton.IsEnabled = false;

    try
    {
        if (string.IsNullOrWhiteSpace(new TextRange(InputField.Document.ContentStart, InputField.Document.ContentEnd).Text))
        {
            OutputField.Document.Blocks.Clear();
            MessageBox.Show("Empty input");
        }
        else
        {
            string[] result;
            await Task.Run(() =>
            {
                Parser nOb = new Parser(new TextRange(InputField.Document.ContentStart, InputField.Document.ContentEnd).Text);
                result = nOb.find();
            });

            if (result == null || result.Length == 0)
            {
                OutputField.Document.Blocks.Clear();
                MessageBox.Show("Nothing found");
            }
            else
            {
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < result.Length; i++)
                {
                    sb.AppendLine(result[i]);
                }

                OutputField.Document.Blocks.Clear();
                OutputField.Document.Blocks.Add(new Paragraph(new Run(sb.ToString())));

                MessageBox.Show("Success");
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Error: " + ex.Message);
    }

    FindButton.Content = "Default";
    FindButton.IsEnabled = true;
}
private async void FindButton_单击(对象发送方,RoutedEventArgs e)
{
FindButton.Content=“搜索…”;
FindButton.IsEnabled=false;
尝试
{
if(string.IsNullOrWhiteSpace(新文本范围(InputField.Document.ContentStart,InputField.Document.ContentEnd.Text))
{
OutputField.Document.Blocks.Clear();
MessageBox.Show(“空输入”);
}
其他的
{
字符串[]结果;
等待任务。运行(()=>
{
Parser nOb=new Parser(新的文本范围(InputField.Document.ContentStart,InputField.Document.ContentEnd.Text);
结果=nOb.find();
});
if(result==null | | result.Length==0)
{
OutputField.Document.Blocks.Clear();
MessageBox.Show(“未找到任何内容”);
}
其他的
{
StringBuilder sb=新的StringBuilder();
for(int i=0;i
这并不能回答问题。@Erno:选择正确的算法是保持计算机响应的唯一方法。如果整个操作系统在交换到磁盘时陷入了困境,那么执行该操作的程序的UI也将没有响应,即使使用了后台线程。频繁的垃圾收集也会冻结UI。@Erno:当然,如果在修复操作的总体成本后,它仍然运行足够长的时间,以至于UI挂起是明显的,那么应该使用后台任务。但是修复性能问题比隐藏它要好。我并不是说答案是错误的(我认为解决方案是正确算法和转移到另一个线程的组合)它根本不能回答为什么应用程序“冻结”这个问题。这也不能回答这个问题。@Erno:选择正确的算法是保持计算机响应的唯一方法。如果整个操作系统在交换到磁盘时陷入了困境,那么执行该操作的程序的UI也将没有响应,即使使用了后台线程。频繁的垃圾收集也会冻结UI。@Erno:当然,如果在修复操作的总体成本后,它仍然运行足够长的时间,以至于UI挂起是明显的,那么应该使用后台任务。但是修复性能问题比隐藏它要好。我并不是说答案是错误的(我认为解决方案是正确算法和转移到另一个线程的组合)它根本无法回答为什么应用程序在不知道您的任务的情况下“冻结”的问题。延迟是因为我们无法真正帮助您。而不知道您的任务是什么。延迟是因为我们无法真正帮助您。