如何使用AYNC文件操作在程序关闭时保存程序状态

时间:2020-09-07 02:53:37

标签: c# .net wpf async-await

如果用户在程序仍在运行时关闭程序或启动关闭程序,则试图保存程序状态,但在这种情况下,将不等待任务,并且在写入设置期间程序会终止,导致文件损坏。如何在不创建其他同步保存方法的情况下做到这一点?

private async void Window_Closed(object sender, EventArgs e)
{
    await programState.Save();
}

//from programState class
private async Task Save()
{        
    var state = JsonConvert.SerializeObject(progState, Formatting.Indented);
    using (FileStream stream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite, FileShare.Read, 4096, FileOptions.Asynchronous | FileOptions.SequentialScan))
    {
        using (var sw = new StreamWriter(stream))
            await sw.WriteAsync(state).ConfigureAwait(true);
    } 
}

1 个答案:

答案 0 :(得分:1)

在这种情况下,无需使用 streams async方法,只需在 synchronous 路径上使用常规StreamWriter.Write(即不要使用 async and await模式)。

但是,如果您确实需要使用Window_Closed之类的事件中的 async and await模式,则需要等待它(仍然知道没有充分的理由这样做)在这种情况下,则必须删除async void事件上的Window_Closed卸载工作;然后等待(不推荐)

private void Window_Closed(object sender, EventArgs e)
{
    Task.Run(() => programState.Save()).Wait();
}

注意:同步运行异步代码 通常会导致死锁 > UI 框架是因为延续与 MessagePump Dispatchers 一起工作的方式。在这种情况下,您需要将async工作转移到线程池,并通过牺牲线程消除死锁。简而言之,不要这样做,只需将其同步保存到流中即可。