第二十章:异步和文件I/O.(十三)

简介: 通过该开销,可以开始实际编写应用程序。 TextFileAsyncPage的XAML文件与TextFileTryoutPage相同,但必须将代码隐藏文件设置为使用异步文件I / O方法。 必须在此处捕获文件I / O函数中可能发生的任何异常,这意味着任何可以抛出异常的方法必须与await运算符一起.

通过该开销,可以开始实际编写应用程序。 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。
这是在三个平台上运行的程序:2018_12_21_104040
大家要是喜欢,支持一下,打开你的支付宝,搜索栏输入“9654711”,领红包你赚我也赚。

目录
相关文章
|
JavaScript Android开发 iOS开发
第二十章:异步和文件I/O.(十二)
虽然每个方法都被定义为返回Task或Task 对象,但是方法的主体没有任何对Task或Task 的引用。相反,返回Task对象的方法只是执行一些工作,然后使用隐式return语句结束该方法。 ExistsAsync方法定义为返回Task 但返回true或false。
785 0
第二十章:异步和文件I/O.(十一)
特定于平台的库 每个程序员都知道应该将可重用的代码放在库中,对于依赖服务使用的代码也是如此。这里开发的异步文件I / O函数将在第24章的NoteTaker程序中重用,您可能希望在自己的应用程序中使用这些函数,或者开发自己的函数。
834 0