如何从按钮异步长流程[重复]

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.StartNewTaskCreationOptions.LongRunning 选项

您可能还需要防止多次按下

最后,当像这样卸载 CPU 限制 工作时,您无法在某些框架(如 WinformsWPF)中更新 UI ) 无需编组回 UI 上下文。有关进度更新的一些相关信息,请参阅此问题C# async/await Progress event on Task<> object

【讨论】:

以上是关于如何从按钮异步长流程[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Cloud Functions for Firebase:在不触及最大超时的情况下完成长流程

Vue项目按钮重复提交

如何在 PHP 中发出异步 HTTP 请求

IOS Swift我如何从异步方法中获得价值[重复]

从构造函数调用的异步方法[重复]

UWP忽略短时间内重复触发的事件