This question already has answers here:
How and when to use ‘async’ and ‘await’
(21个回答)
9个月前关闭。
目前,我有一个调用函数的按钮,其处理时间为10-20秒。是否可能有一些文本,例如“请稍候...”,而不是应用程序挂起。
这是我调用函数的按钮:
这是执行时间过长的函数:
任何建议/评论TIA。
您可能希望捕获点击事件中的所有异常,并将其作为
如果您担心使用线程池线程,可以将
您可能还需要防止多次按下
最后,当卸载这样的CPU绑定工作时,您不能在不编组回UI上下文的情况下在某些框架(如Winforms或WPF)中更新UI。有关进度更新C# async/await Progress event on Task<> object的一些相关信息,请参见此问题。
(21个回答)
9个月前关闭。
目前,我有一个调用函数的按钮,其处理时间为10-20秒。是否可能有一些文本,例如“请稍候...”,而不是应用程序挂起。
这是我调用函数的按钮:
private void btnExec_Click(object sender, EventArgs e)
{
LongProcess();
}
这是执行时间过长的函数:
public void LongProcess()
{
DataTable table = new DataTable();
table.Columns.Add("DateTime", typeof(string));
table.Columns.Add("Mass1", typeof(string));
table.Columns.Add("Mass2", typeof(string));
table.Columns.Add("Mass3", typeof(string));
Console.WriteLine(startDate.Value);
Console.WriteLine(endDate.Value);
decimal v = decimal.Parse("1.6345e-008", NumberStyles.Float);
var pattern = @"^""\d+/\d+/\d+ \d+:\d+:\d+ (AM|PM)""\s+-?\d+\s+\d+.?\d+e-\d+";
var regex = new Regex(pattern, RegexOptions.Compiled);
string[] filePaths = Directory.GetFiles(@"C:\\test\\", "*.txt");
var results = new List<string>();
foreach (var file in filePaths)
{
var lines = File.ReadLines(file).Where(x => regex.IsMatch(x));
results.AddRange(lines);
}
foreach (var result in results)
{
string[] words = (result.ToString()).Split(' ');
string date = words[0].Substring(1) + " " + words[1];
DateTime oDate = DateTime.Parse(date);
if (oDate >= startDate.Value && oDate <= endDate.Value)
{
string[] words2 = (words[2].ToString()).Split('\t');
string m1 = words2[2];
string m2 = words2[3];
string m3 = words2[4];
table.Rows.Add(new object[] { oDate.ToString(), m1, m2, m3});
File.WriteAllText(@"C:\\test.csv", sb.ToString());
Console.WriteLine("Done Parsing");
}
任何建议/评论TIA。
最佳答案
最简单的方法是将工作卸载到新的线程/任务并使用异步等待模式
private async void btnExec_Click(object sender, EventArgs e)
{
try
{
await Task.Run(() => LongProcess());
// or
await Task.Run(LongProcess);
}
catch (Exception exception)
{
// catch any exceptions, as this method will be unobserved
// Console.WriteLine(exception);
}
}
您可能希望捕获点击事件中的所有异常,并将其作为
async void
。像这样留下异常现象可能会导致问题如果您担心使用线程池线程,可以将
Task.Factory.StartNew
与TaskCreationOptions.LongRunning
选项一起使用您可能还需要防止多次按下
最后,当卸载这样的CPU绑定工作时,您不能在不编组回UI上下文的情况下在某些框架(如Winforms或WPF)中更新UI。有关进度更新C# async/await Progress event on Task<> object的一些相关信息,请参见此问题。
关于c# - 如何从按钮异步长过程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55331729/
10-17 01:17