gpt4 book ai didi

c# - Xamarin:重构以使用异步/等待

转载 作者:太空宇宙 更新时间:2023-11-03 21:35:03 25 4
gpt4 key购买 nike

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

ViewModel 的数据提供者接口(interface)

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

登录的接口(interface)实现。这里只是为了假网络调用而 sleep ......

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 的最佳方法是什么?

最佳答案

你可以这样做:

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

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

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

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

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

关于c# - Xamarin:重构以使用异步/等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22214370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com