gpt4 book ai didi

c# - Windows RT - StorageFile 的同步使用

转载 作者:行者123 更新时间:2023-11-30 14:59:47 26 4
gpt4 key购买 nike

我想编写一个 Win8 应用程序,我在那里使用了一个带有 static 成员的 Configuration 类,它在启动时加载一次,并且可以在任何地方访问运行时。

所以,主要问题是,默认设置存储在一个 xml 文件中,但读取文件内容是异步的 (StorageFile),但我没有找到任何解决方案等待,直到文件已完全加载,因为不可能在所有情况下(主线程、构造函数)都使用 await,这在我看来是一个设计问题。如果在访问 Configuration 数据之前未完全读取文件,则此应用程序将出现不正确的行为。

这是一个示例代码:

public class Configuration
{
// stores the only instance of this class
private Configuration instance = null;

// public access to the instance
public Configuration Current
{
get
{
if (instance == null)
{
instance = new Configuration();
}

return instance;
}
}

private Configuration()
{
// load data from file synchronously
// so it is loaded once on first access
}
}

我不确定,如何解决这个问题,可能我需要更改我的 Configuration 类的设计。任何建议/提示都会很好。

最佳答案

设计决定不允许任何可能需要超过 50 毫秒的同步调用,即任何文件或网络 IO 调用,以使应用程序响应更快。

尽管您不能await 来自构造函数的异步调用,但是没有什么可以阻止您在不等待它们完成的情况下触发此类调用:

private Configuration()
{
Init();
}

private async void Init()
{
var contents = await FileIO.ReadTextAsync(file);
}

然后您可以在 Init() 中设置 Configuration 属性。如果您实现 INotifyPropertyChanged,您可以在加载值之前将它们绑定(bind)到 UI,一旦加载完成,UI 就会刷新。

如果您需要在应用中的某个时刻检查或等待操作完成,您可以更改 Init() 的签名以返回 Task:

private Configuration()
{
InitTask = Init();
}

private async Task Init()
{
var contents = await FileIO.ReadTextAsync(file);
}

public Task InitTask { get; private set; }

现在可以检查是否完成了:

if (Configuration.Current.IsCompleted)
{
//
}

甚至 await 它(如果 Task 已经完成,这将立即完成):

await Configuration.Current.InitTask;

编辑:

如果在加载所述文件之前向用户显示任何内容是没有意义的,您可以修改您的入口页面以具有替代“ View ”:

  • 实际 View (您希望用户在应用准备就绪时看到)
  • 启动画面 View (例如显示进度指示器)

您可以根据 IsCompleted 属性使正确的可见,您应该在您的 View 模型上公开该属性并实现 INotifyPropertyChanged

然后您可以按如下方式设计您的页面:

<Page xmlns:common="using:MyApp.Common">
<Page.Resources>
<common:BooleanToVisibilityConverter x:Key="BoolToVisibilityConverter" />
</Page.Resources>
<Grid>
<Grid Visibility="{Binding Configuration.IsCompleted, Converter={StaticResource BoolToVisibilityConverter}">
<!-- put your actual view here -->
</Grid>
<Grid Visibility="{Binding Configuration.IsNotCompleted, Converter={StaticResource BoolToVisibilityConverter}">
<!-- put your splash screen view here -->
</Grid>
</Grid>
</Page>

关于c# - Windows RT - StorageFile 的同步使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16274684/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com