如何从按钮异步长流程[重复]
Posted
技术标签:
【中文标题】如何从按钮异步长流程[重复]【英文标题】:How to async long process from button [duplicate] 【发布时间】:2019-08-15 08:03:46 【问题描述】:目前我有一个调用函数的按钮,处理时间为 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。
【问题讨论】:
您的应用程序是 ASP.NET 还是 WinForms? 我认为副本充其量是粗略的 【参考方案1】:最简单的方法是将工作卸载到一个新的线程/任务并使用Async Await图案
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 限制 工作时,您无法在某些框架(如 Winforms 或 WPF)中更新 UI ) 无需编组回 UI 上下文。有关进度更新的一些相关信息,请参阅此问题C# async/await Progress event on Task<> object
【讨论】:
以上是关于如何从按钮异步长流程[重复]的主要内容,如果未能解决你的问题,请参考以下文章