提问者:小点点

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


目前我有一个按钮,调用一个函数,有一个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");
        }

任何支持/评论。


共1个答案

匿名用户

最简单的方法是将工作卸载到一个新的线程/任务,并使用异步等待模式

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);
    }
}

> 。像这样不观察异常会导致问题

如果您担心使用线程池线程,可以将选项一起使用

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

最后,当像这样卸载CPU绑定的工作时,在某些框架(如Winforms或WPF)中,如果不将其编组回UI上下文,则无法更新UI。有关任务上的进度更新C#Async/Await progress事件的相关信息,请参阅此问题;对象

相关问题