通过该开销,可以开始实际编写应用程序。 TextFileAsyncPage的XAML文件与TextFileTryoutPage相同,但必须将代码隐藏文件设置为使用异步文件I / O方法。 必须在此处捕获文件I / O函数中可能发生的任何异常,这意味着任何可以抛出异常的方法必须与await运算符一起位于try块中:
public partial class TextFileAsyncPage : ContentPage
{
FileHelper fileHelper = new FileHelper();
public TextFileAsyncPage()
{
InitializeComponent();
RefreshListView();
}
async void OnSaveButtonClicked(object sender, EventArgs args)
{
saveButton.IsEnabled = false;
string filename = filenameEntry.Text;
if (await fileHelper.ExistsAsync(filename))
{
bool okResponse = await DisplayAlert("TextFileTryout",
"File " + filename +
" already exists. Replace it?",
"Yes", "No");
if (!okResponse)
return;
}
string errorMessage = null;
try
{
await fileHelper.WriteTextAsync(filenameEntry.Text, fileEditor.Text);
}
catch (Exception exc)
{
errorMessage = exc.Message;
}
if (errorMessage == null)
{
filenameEntry.Text = "";
fileEditor.Text = "";
RefreshListView();
}
else
{
await DisplayAlert("TextFileTryout", errorMessage, "OK");
}
saveButton.IsEnabled = true;
}
async void OnFileListViewItemSelected(object sender, SelectedItemChangedEventArgs args)
{
if (args.SelectedItem == null)
return;
string filename = (string)args.SelectedItem;
string errorMessage = null;
try
{
fileEditor.Text = await fileHelper.ReadTextAsync((string)args.SelectedItem);
filenameEntry.Text = filename;
}
catch (Exception exc)
{
errorMessage = exc.Message;
}
if (errorMessage != null)
{
await DisplayAlert("TextFileTryout", errorMessage, "OK");
}
}
async void OnDeleteMenuItemClicked(object sender, EventArgs args)
{
string filename = (string)((MenuItem)sender).BindingContext;
await fileHelper.DeleteAsync(filename);
RefreshListView();
}
async void RefreshListView()
{
fileListView.ItemsSource = await fileHelper.GetFilesAsync();
fileListView.SelectedItem = null;
}
}
结果是,此代码的结构非常类似于使用同步文件I / O函数的先前代码。 但是,一个区别是OnSaveButtonClicked方法在开始处理时禁用“保存”按钮,然后在完成所有操作后重新启用它。 这只是为了防止多次按下Save按钮,这可能导致多次重复调用FileIO.WriteFileAsync。
这是在三个平台上运行的程序:
大家要是喜欢,支持一下,打开你的支付宝,搜索栏输入“9654711”,领红包你赚我也赚。