【问题标题】:OnContextItemSelected async callOnContextItemSelected 异步调用
【发布时间】:2016-10-19 00:17:57
【问题描述】:

问题

我重写了 Xamarin Android 中的 bool OnContextItemSelected(IMenuItem item) 方法以捕获用户单击上下文菜单的时间。

当用户点击菜单中的特定项目时,我会调用网络服务来删除与点击的行相关的一些信息。

我想在不阻塞 UI 线程的情况下删除信息,但仍然可以控制执行。你有什么想法?任何任务黑魔法? :-)

约束

1) 我不能在 OnContextItemSelected 中使用 async 关键字,因为它会将返回类型从 bool 更改为 Task

2) webservice 调用不应阻塞 UI 线程。

尝试的解决方案

1) 将返回类型更改为 Task 并以某种方式仍然覆盖该方法。

2) 使用Task task = Task.Run(async () => ....) 然后Task.Wait()

3) 无需等待即可使用 Task task = Task.Run(async () => ... )。我在工作,但我无法控制任务何时完成。

示例代码

public override bool OnContextItemSelected(IMenuItem item)
{
            if (item.ItemId == Resource.Id.delete)
            {
                   ...
                   //Call webservice without blocking the UI thread
            }
}

【问题讨论】:

    标签: c# android asynchronous xamarin task


    【解决方案1】:

    我建议您实现另一个从事件处理程序调用的 async 方法:

    private async Task TellWebServiceToRemoveAsync()
    {
        await webService.RemoveAsync(); // or whatever it's called
        // do what you need to do when webservice has finished
        // this will happen on the UI thread again
    }
    
    public override bool OnContextItemSelected(IMenuItem item)
    {
        if (item.ItemId == Resource.Id.delete)
        {
            TellWebServiceToRemoveAsync();
            return true;                   
        }
    }
    

    编译器将TellWebServiceToRemoveAsync() 转换为状态机。在await 关键字处,控制流将返回给调用者(您的事件处理程序并从那里返回到 UI)。

    当异步 web 服务调用完成后,TellWebServiceToRemoveAsync() 的执行将在await 关键字之后恢复,但在 UI 线程上

    因此您可以从那里操作您的 UI 控件。

    【讨论】:

    • TellWebServiceToRemoveAsync 完成后如何操作 UI 控件?我怎么知道它什么时候完成?
    • @MortenGR 您可以在内部 TellWebServiceToRemoveAsync 操作您的控件。当 web 服务调用完成时,在await 之后恢复执行。更新了我的答案。
    • 优秀。似乎按预期工作。我可以使用 Task task = TellWebServiceToRemoveAsync(); 来避免编译器警告是否正确:因为没有等待调用,所以当前方法的执行在之前继续......
    • @MortenGR 是的,这是正确的。事实上,编译器警告建议这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多