UWP是我的头脑,对这个问题感到抱歉。
为什么文件会阻止我的UWP加载?
public static async Task CreateFile()
{
StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
var item = await ApplicationData.Current.LocalFolder.TryGetItemAsync("sFile.xml");
if (item == null)
{
StorageFile file = await storageFolder.CreateFileAsync("sFile.xml");
await FileIO.WriteLinesAsync(file, GlobalVars.fileStrings);
}
}
从我的主方法
调用此函数 CreateFile
函数永远不会返回。那是为什么?
编辑:添加主要方法
public GroupedItemsPage()
{
this.InitializeComponent();
this.navigationHelper = new NavigationHelper(this);
this.navigationHelper.LoadState += navigationHelper_LoadState;
try
{
SampleDataSource.CreateFile().Wait();
Debug.WriteLine("Continue");
}
catch (Exception ex)
{
var msg = new MessageDialog(ex.StackTrace);
Task.Run(async () => { await msg.ShowAsync(); }).Wait();
throw ex.InnerException;
}
GlobalVars.LastFreeSignalCheckTimer.Tick += SampleDataSource.LastFreeSignalCheckTimer_Tick;
GlobalVars.LastFreeSignalCheckTimer.Interval = new TimeSpan(0, 0, 0, 120);
GlobalVars.LastFreeSignalCheckTimer.Start();
}
答案 0 :(得分:2)
我认为问题是来自SampleDataSource.CreateFile()的.Wait()。Wait();使用await SampleDataSource.CreateFile();代替。
Wait()是一个阻塞操作,如果你想使用它,你必须要小心,因为你可以很容易地建立一个死锁。在大多数情况下等待是更好的选择。
在这种情况下,您使用Wait()阻止UI线程,以防止在同一线程中成功执行CreateFile()方法。等待代替你的代码应该工作,因为在你等待的时候没有阻塞线程,以便可以执行其他代码(比如你的CreateFile())。
另一个解决方案是使用Task.Run在后台执行该方法,以便您可以等待Wait(),因为该方法不会在同一个被阻塞的线程中执行(但它仍然是丑陋的代码设计来阻止整个UI线程)。
答案 1 :(得分:1)
你正陷入僵局。这就是为什么你永远不应该阻止async
代码的原因。
不是在CreateFile
的构造函数中调用异步Page
方法,这是不好的做法,您可以通过处理Loaded
事件来初始化页面后调用它。这页纸。然后,您可以await
使用async
方法:
public sealed partial class GroupedItemsPage : Page
{
public GroupedItemsPage()
{
this.InitializeComponent();
this.navigationHelper = new NavigationHelper(this);
this.navigationHelper.LoadState += navigationHelper_LoadState;
this.Loaded += GroupedItemsPage_Loaded;
}
private async void GroupedItemsPage_Loaded(object sender, RoutedEventArgs e)
{
try
{
await SampleDataSource.CreateFile();
Debug.WriteLine("Continue");
}
catch (Exception ex)
{
var msg = new MessageDialog(ex.StackTrace);
await msg.ShowAsync();
throw ex.InnerException;
}
GlobalVars.LastFreeSignalCheckTimer.Tick += SampleDataSource.LastFreeSignalCheckTimer_Tick;
GlobalVars.LastFreeSignalCheckTimer.Interval = new TimeSpan(0, 0, 0, 120);
GlobalVars.LastFreeSignalCheckTimer.Start();
}
}