UITextField.ShouldReturn:如何使用异步方法?

时间:2014-01-08 20:50:17

标签: c# ios xamarin.ios async-await

我一直盯着这段代码,但无法弄清楚如何正确修复它。我有UITextField。如果按下RETURN,则应该执行async方法。下面的代码给了我一个编译器警告,我应该考虑使用await HandleNextStep()。不能这样做,因为ShouldReturn不是异步的:

delegate bool UITextFieldCondition(UITextField textField);

我能解决这个问题吗?我应该修理吗? ShouldReturn()HandleNextStep()完成之前立即返回是否重要?

this.txt.ShouldReturn = textField =>
{
    this.HandleNextStep();
    return true;
};

2 个答案:

答案 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