重构此代码以使用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的最佳方法是什么?
答案 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调用服务器以确认登录。