问题
我在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
}
}
答案 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控件。