C#Thread.Sleep(ms)冻结用户界面,我可以';不要使用其他选项

C#Thread.Sleep(ms)冻结用户界面,我可以';不要使用其他选项,c#,wpf,csv,delay,sleep,C#,Wpf,Csv,Delay,Sleep,我正在制作包含CSV编写的C#WPF应用程序 但是,我想耽搁一下。但是当我使用 线程睡眠(ms), 用户界面冻结,Windows显示此程序已停止 所以,我找到了一些替代方案,比如 private static DateTime Delay(int MS) { DateTime ThisMoment = DateTime.Now; TimeSpan duration = new TimeSpan(0, 0, 0, 0, MS); Da

我正在制作包含CSV编写的C#WPF应用程序

但是,我想耽搁一下。但是当我使用
线程睡眠(ms)
, 用户界面冻结,Windows显示此程序已停止

所以,我找到了一些替代方案,比如

private static DateTime Delay(int MS)
     {
         DateTime ThisMoment = DateTime.Now;
         TimeSpan duration = new TimeSpan(0, 0, 0, 0, MS);
         DateTime AfterWards = ThisMoment.Add(duration);
         while (AfterWards >= ThisMoment)
         {
             if (System.Windows.Application.Current != null)
             {
                 System.Windows.Application.Current.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Background, new Action(delegate { }));
             }
             ThisMoment = DateTime.Now;
         }
         return DateTime.Now;
     }
但是,当我使用这个方法时,程序就停止了

这是制作、写入CSV文件的按钮代码

 private void button_Click(object sender, RoutedEventArgs e)
    {

        try
        {
            System.IO.StreamWriter file = new System.IO.StreamWriter(@"New.csv");
            int a = 1;
            file.WriteLine("Delta, Theta");
            while (a < 20)
            {

                file.WriteLine("{0}, {1}", TGLatestData.EegPowerDelta, TGLatestData.EegPowerTheta);
                a++;
                file.Close();
                Thread.Sleep(3000);    //Delay(3000); When I use Alternative way.
            }
        }
        catch (Exception ex)
        {
            throw new ApplicationException("Broken", ex);
        }
    }
private void按钮\u单击(对象发送者,路由目标)
{
尝试
{
System.IO.StreamWriter file=new System.IO.StreamWriter(@“new.csv”);
INTA=1;
WriteLine(“Delta,Theta”);
而(a<20)
{
WriteLine(“{0},{1}”,TGLatestData.EegPowerDelta,TGLatestData.EegPowerTheta);
a++;
file.Close();
Thread.Sleep(3000);//延迟(3000);当我使用另一种方法时。
}
}
捕获(例外情况除外)
{
抛出新的ApplicationException(“断开”,例如);
}
}

我想知道的主要问题是如何在不冻结UI的情况下延迟几秒钟。抱歉语法错误。

使您的单击处理程序异步。然后可以使用
Task.Delay
,它不会阻塞线程

private async void button_Click(object sender, RoutedEventArgs e)
{
    try
    {
        System.IO.StreamWriter file = new System.IO.StreamWriter(@"New.csv");
        int a = 1;
        file.WriteLine("Delta, Theta");
        while (a < 20)
        {
            file.WriteLine("{0}, {1}", TGLatestData.EegPowerDelta, TGLatestData.EegPowerTheta);
            a++;
            file.Close();
            await Task.Delay(3000);
        }
    }
    catch (Exception ex)
    {
        throw new ApplicationException("Broken", ex);
    }
}
private async void按钮\u单击(对象发送方,路由目标)
{
尝试
{
System.IO.StreamWriter file=new System.IO.StreamWriter(@“new.csv”);
INTA=1;
WriteLine(“Delta,Theta”);
而(a<20)
{
WriteLine(“{0},{1}”,TGLatestData.EegPowerDelta,TGLatestData.EegPowerTheta);
a++;
file.Close();
等待任务。延迟(3000);
}
}
捕获(例外情况除外)
{
抛出新的ApplicationException(“断开”,例如);
}
}
顺便说一句,这里有一种修复异常的方法:

private async void button_Click(object sender, RoutedEventArgs e)
{
    const string fileName = @"New.csv";
    try
    {
        File.AppendAllText(fileName, "Delta, Theta");
        for (var a=1; a<20; a++)
        {
            var text = string.Format("{0}, {1}", TGLatestData.EegPowerDelta, TGLatestData.EegPowerTheta);
            File.AppendAllText(fileName, text);
            await Task.Delay(3000);
        }
    }
    catch (Exception ex)
    {
        throw new ApplicationException("Broken", ex);
    }
}
private async void按钮\u单击(对象发送方,路由目标)
{
常量字符串文件名=@“New.csv”;
尝试
{
AppendAllText(文件名,“Delta,Theta”);

对于(var a=1;a使您的单击处理程序异步。然后您可以使用
Task.Delay
,这将不会阻塞线程

private async void button_Click(object sender, RoutedEventArgs e)
{
    try
    {
        System.IO.StreamWriter file = new System.IO.StreamWriter(@"New.csv");
        int a = 1;
        file.WriteLine("Delta, Theta");
        while (a < 20)
        {
            file.WriteLine("{0}, {1}", TGLatestData.EegPowerDelta, TGLatestData.EegPowerTheta);
            a++;
            file.Close();
            await Task.Delay(3000);
        }
    }
    catch (Exception ex)
    {
        throw new ApplicationException("Broken", ex);
    }
}
private async void按钮\u单击(对象发送方,路由目标)
{
尝试
{
System.IO.StreamWriter file=new System.IO.StreamWriter(@“new.csv”);
INTA=1;
WriteLine(“Delta,Theta”);
而(a<20)
{
WriteLine(“{0},{1}”,TGLatestData.EegPowerDelta,TGLatestData.EegPowerTheta);
a++;
file.Close();
等待任务。延迟(3000);
}
}
捕获(例外情况除外)
{
抛出新的ApplicationException(“断开”,例如);
}
}
顺便说一句,这里有一种修复异常的方法:

private async void button_Click(object sender, RoutedEventArgs e)
{
    const string fileName = @"New.csv";
    try
    {
        File.AppendAllText(fileName, "Delta, Theta");
        for (var a=1; a<20; a++)
        {
            var text = string.Format("{0}, {1}", TGLatestData.EegPowerDelta, TGLatestData.EegPowerTheta);
            File.AppendAllText(fileName, text);
            await Task.Delay(3000);
        }
    }
    catch (Exception ex)
    {
        throw new ApplicationException("Broken", ex);
    }
}
private async void按钮\u单击(对象发送方,路由目标)
{
常量字符串文件名=@“New.csv”;
尝试
{
AppendAllText(文件名,“Delta,Theta”);
对于(var a=1;a
我太傻了。我在循环中使用了
file.Close();
。所以,它说的是IOException。我找到了其他方法来避免它们,并最终得到了它。多亏了John Wu,đěxěŕ帮助我


我太傻了。我用了
file.Close()
在循环中。所以,它是IOException。我找到了其他方法来避免它们,最终得到了它。感谢John Wu,đěxěŕ帮助我。

非常感谢,但是,我已经这样做了,但是,在30秒后,Windows说程序停止了。还有其他方法可以延迟吗?这是正确的方法。你应该知道为什么程序停止,例如,如果您有未处理的异常,请对其进行处理。在您的代码示例中,似乎您关闭了该文件,并且在尝试再次写入之前从未重新打开它,因此它当然会失败。为什么要在循环中写入并关闭该文件?当它出现时,它将不起作用。此外,写入该文件也不是asnyc,所以它将被阻止。使用异步处理程序仍然不起作用。@đěxěŕ我太傻了。如果我写Close()“while函数”之外的代码,我应该在while函数之后等待时间关闭文件。非常感谢您给我这个尖锐的问题。我终于明白了!:D@JohnWu我终于采纳了你的代码。非常感谢你给我一个很好的提示!:非常感谢,但是,我已经这样做了,但是,在3秒钟后,Windows说程序停止了。还有其他的吗她的延迟替代方案?这是正确的方法。您可能应该找出程序停止的原因,例如,如果您有未处理的异常,并对其进行处理。在您的代码示例中,您似乎关闭了该文件,并且在尝试再次写入该文件之前从未重新打开过该文件,因此它当然会失败。为什么您要在循环?当它出现时,它将不起作用。同时,写入文件不是asnyc,因此它将被阻止。使用异步处理程序仍然不起作用。@chođxěŕ我太傻了。如果我写Close()“while函数”之外的代码,我应该在while函数之后等待时间关闭文件。非常感谢您给我这个尖锐的问题。我终于明白了!:D@JohnWu我终于接受了你的代码。非常感谢你给我一个好的提示!我想问题是,为什么你要在点击一个按钮并写下后睡
3秒钟到文件?。此外,由于
file.Close()
在循环中,因此下一个
file.WriteLine()
将失败。我想问题是,在单击按钮并写入文件后,为什么要睡眠
3秒
。此外,由于
file.Close()的原因,您的代码将无法工作
在循环中,因此下一个
文件.WriteLine()
将失败