如果用户在程序仍在运行时关闭程序或启动关闭程序,则试图保存程序状态,但在这种情况下,将不等待任务,并且在写入设置期间程序会终止,导致文件损坏。如何在不创建其他同步保存方法的情况下做到这一点?
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);
}
}
答案 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
工作转移到线程池,并通过牺牲线程消除死锁。简而言之,不要这样做,只需将其同步保存到流中即可。