我一直盯着这段代码,但无法弄清楚如何正确修复它。我有UITextField
。如果按下RETURN,则应该执行async
方法。下面的代码给了我一个编译器警告,我应该考虑使用await HandleNextStep()
。不能这样做,因为ShouldReturn
不是异步的:
delegate bool UITextFieldCondition(UITextField textField);
我能解决这个问题吗?我应该修理吗? ShouldReturn()
在HandleNextStep()
完成之前立即返回是否重要?
this.txt.ShouldReturn = textField =>
{
this.HandleNextStep();
return true;
};
答案 0 :(得分:2)
也不是Monotouch开发人员,但我认为你可以忽略这个警告,除非你真的对观察HandleNextStep()
异步调用返回的任务的完成感兴趣。
以下内容将取消VS 2012中的警告:
this.txt.ShouldReturn = textField =>
{
var task = this.HandleNextStep(); // presumably, no more warning
return true;
};
如果你真的想观察任务的状态,你可以这样做(不再警告):
Task _handleNextStepTask; // a member variable
// ...
this.txt.ShouldReturn = textField =>
{
this._handleNextStepTask = this.HandleNextStep().ContinueWith(
t => Debug.Print("NextStepHandled"),
TaskScheduler.FromCurrentSynchronizationContext());
return true;
};
或者甚至类似下面的内容,如果你真的不想将Task
对象存储在任何地方,仍然不再警告:
this.txt.ShouldReturn = textField =>
{
(new Action(async () =>
{
try
{
await this.HandleNextStep();
// executed synchronously until this point
Debug.Print("NextStepHandled");
}
catch (Exception ex)
{
// catch all exceptions inside "async void" lambda
Debug.Print(ex.Message);
}
}))();
return true;
};
后一种方法可能被视为code smell,但我认为在这种特定情况下可以使用它。
答案 1 :(得分:-1)
我相信你可以为你的活动使用异步lambda。
this.txt.ShouldReturn = async textField =>
{
await this.HandleNextStep();
return true;
};
编辑:这里有一个很好的例子:“Async Lambda”下的http://msdn.microsoft.com/en-us/library/bb397687.aspx