Xamarin:重构使用async / await

时间:2014-03-06 03:39:32

标签: c# ios asynchronous xamarin.ios xamarin

重构此代码以使用async / await的最佳方法是什么?此代码段来自Xamarin Field Services Sample App

ViewModels的数据提供程序界面

public interface ILoginService {
            Task<bool> LoginAsync (string username, string password, CancellationToken cancellationToken = default(CancellationToken));
    }

登录的接口实现。这里只是睡觉假网络电话......

public class LoginService : ILoginService {    
   public Task<bool> LoginAsync (string username, string password, CancellationToken cancellationToken = default(CancellationToken)) {
            return Task.Factory.StartNew (() => {
                Thread.Sleep (1000);
                return true;
            }, cancellationToken);
        }
}

按钮点击处理程序

partial void Login () {
        //some ui related code
        loginViewModel
            .LoginAsync ()
            .ContinueWith (_ => 
                BeginInvokeOnMainThread (() => {
                    //go to different view
                }));
    }

重构此代码以使用async / await的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

你可以这样做:

partial async void Login () 
{
    //some ui related code
    await loginViewModel.LoginAsync ();
     //go to different view
}

您不需要切换线程,因为await会捕获当前SynchroniztionContext并将该方法的其余部分作为相同上下文的延续。对于UI线程,这实际上意味着go to different view部分也将在UI thrad上执行。

您可能应该检查LoginAsync操作的结果

private async void Login () 
{
    //some ui related code
    if(await loginViewModel.LoginAsync())
    {
        //go to different view
    }
    else
    {
       // login failed
    }
}

我不会再进一步​​重构,因为它非常简单。

答案 1 :(得分:1)

难以将延迟重构为任何有意义的东西,但它只是这样:

public class LoginService : ILoginService 
{    
    public async Task<bool> LoginAsync (string username, string password, CancellationToken cancellationToken = default(CancellationToken)) 
    {
        await Task.Delay(TimeSpan.FromMilliseconds(1000), cancellationToken);
        return true;
    }
}

延迟将被替换为f.e.异步Web调用服务器以确认登录。