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挂起是明显的,那么应该使用后台任务。但是修复性能问题比隐藏它要好。我并不是说答案是错误的(我认为解决方案是正确算法和转移到另一个线程的组合)它根本无法回答为什么应用程序在不知道您的任务的情况下“冻结”的问题。延迟是因为我们无法真正帮助您。而不知道您的任务是什么。延迟是因为我们无法真正帮助您。