【发布时间】:2017-10-21 09:25:42
【问题描述】:
应用程序从 inputField 中获取文本,在其中搜索正则表达式匹配并将结果返回到 outputField。把它放在几行代码中,我有这样的东西:
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;
}
问题是当来自 inputField 的文本非常大并且程序试图找到所有匹配项时,UI 开始冻结。最小化程序窗口变得不可能,Windows 说该应用程序没有响应并询问我是否要关闭它。如果我在工作期间不点击程序,它就可以完成。那么是否有可能以某种方式避免冻结,并在应用大输入时最小化应用程序?任何帮助表示赞赏。
【问题讨论】:
-
在不知道您的 Task.Delay 是什么的情况下,我们无能为力。
标签: c# wpf user-interface freeze