文件创建阻止UWP加载

时间:2017-02-24 22:30:52

标签: c# xml file uwp

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

2 个答案:

答案 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();
    }
}