OnContextItemSelected异步调用

时间:2016-06-17 08:36:52

标签: c# android asynchronous xamarin task

问题

我在Xamarin Android中覆盖方法bool OnContextItemSelected(IMenuItem item),以便在用户点击上下文菜单时捕获。

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

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

约束

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

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

尝试解决方案

1)将返回类型更改为“任务”,并以某种方式仍然覆盖该方法。

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
            }
}

1 个答案:

答案 0 :(得分:2)

我建议您实现从事件处理程序调用的另一个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()关键字后再次恢复执行,而UI线程

所以你可以从那里操纵你的UI控件。