创建事件是否是将 XF OnAppearing 变成异步方法的有效方法?

2023-12-29

我最近看到了关于如何将应用程序 OnStart 变成异步 OnStart 的建议:

    protected override void OnStart()
    {
        this.started += onStarted;      //Subscribe to event
        started(this, EventArgs.Empty); //Raise event
    }

    protected async void onStarted(object sender, EventArgs args)
    {
        try
        {
            await // do things
        }
        catch (Exception ex)
        {
            var ignore = ex;
        }
        this.started -= onStarted;
    }

任何人都可以看到任何可能的问题吗?如果没有,那么是否可以将类似的内容应用于 OnAppearing,如果是,是否需要进行任何更改。


OnAppearing简单来说就是一个voidPage 类的方法

Xamarin.Forms.Page

//...

protected virtual void OnAppearing()
{
}

//...

Source https://github.com/xamarin/Xamarin.Forms/blob/master/Xamarin.Forms.Core/Page.cs#L282

这被称为页面生命周期的一部分。

//...

[EditorBrowsable(EditorBrowsableState.Never)]
public void SendAppearing()
{
    if (_hasAppeared)
        return;

    _hasAppeared = true;

    if (IsBusy)
    {
        if (IsPlatformEnabled)
            MessagingCenter.Send(this, BusySetSignalName, true);
        else
            _pendingActions.Add(() => MessagingCenter.Send(this, BusySetSignalName, true));
    }

    OnAppearing(); //<---
    Appearing?.Invoke(this, EventArgs.Empty); //NOTE HOW ACTUAL EVENT IS RAISED AFTER

    var pageContainer = this as IPageContainer<Page>;
    pageContainer?.CurrentPage?.SendAppearing();

    FindApplication(this)?.OnPageAppearing(this);
}

//...

Source https://github.com/xamarin/Xamarin.Forms/blob/master/Xamarin.Forms.Core/Page.cs#L413

不要将它们误认为是事件处理程序,这是允许使用的一个例外async void.

参考Async/Await - 异步编程的最佳实践 https://learn.microsoft.com/en-us/archive/msdn-magazine/2013/march/async-await-best-practices-in-asynchronous-programming

您中显示的方法OnStart示例也可以应用于OnAppearing

例如

public partial class SomePage : ContentPage {
    public SomelPage() {
        InitializeComponent();
        appearing += onAppearing;
    }

    protected override void OnAppearing() {
        appearing(this, EventArgs.Empty);
        appearing -= onAppearing;
    }

    event EventHandler appearing = delegate { };

    private async void onAppearing(object sender, EventArgs args) {
        try {
            var locator = CrossGeolocator.Current;
            var position = await locator.GetPositionAsync();

            var places = await SomeService.getPlacesOfInterest(position.Latitude, position.Longitude);
            placesListView.ItemsSource = places;
        } catch( Exception ex) {
            //handler error (Log?)
        }
    }
}

或者您可以订阅actual Appearing直接事件

//...

public event EventHandler Appearing;

//...

Source https://github.com/xamarin/Xamarin.Forms/blob/master/Xamarin.Forms.Core/Page.cs#L177

并放弃覆盖OnAppearing() method

public partial class SomePage : ContentPage {
    public SomelPage() {
        InitializeComponent();
        Appearing += onAppearing;
    }

    private async void onAppearing(object sender, EventArgs args) {
        try {
            var locator = CrossGeolocator.Current;
            var position = await locator.GetPositionAsync();

            var places = await SomeService.getPlacesOfInterest(position.Latitude, position.Longitude);
            placesListView.ItemsSource = places;
        } catch( Exception ex) {
            //handler error (Log?)
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建事件是否是将 XF OnAppearing 变成异步方法的有效方法? 的相关文章

  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 如何在 xamarin.ios 中全局隐藏导航栏后退按钮标题

    我在 AppDelegate 中使用了这段代码 UIBarButtonItem Appearance SetBackButtonTitlePositionAdjustment new UIOffset 100 60 UIBarMetrics
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr

随机推荐