我一直在审查应用开发公司在Xamarin为我做的代码。当我尝试编译
时namespace AppName.Droid
public class SplashActivity : AppCompatActivity
{
protected override void OnStart ()
{
base.OnStart ();
Task.Run (Login);
}
async void Login()
{
await LoadCurrentProfile().ContinueWith(result => {
if (ApplicationState.Profile== null)
{
GoLogin ();
}
else
{
GoBegin ();
}
});
}
}
" Task.Run(登录)"
'void SplashActivity.Login()' has the wrong return type
我可以更改某些东西,以便我可以在我的机器上编译应用程序吗?
答案 0 :(得分:4)
您对async
的处理方式存在一些问题。我建议您阅读我的async
intro blog post和async
best practices article。
特别是,您应遵循以下约定:
ContinueWith
。请改用await
。async void
。除非 使用async Task
。async void
Task.Run
从UI线程推送CPU绑定的工作。如果是您的代码,则没有理由使用Task.Run
。结合这些,代码非常简单,并且语义也更合理(特别是登录错误不会被忽略):
protected override async void OnStart ()
{
base.OnStart();
await LoginAsync();
}
async Task LoginAsync()
{
await LoadCurrentProfile();
if (ApplicationState.Profile == null)
{
GoLogin();
}
else
{
GoBegin();
}
}
答案 1 :(得分:2)
更改Login
的签名以返回Task
,如下所示:
async Task Login()
{
//...
}
并称之为:
Task.Run( (Func<Task>) Login);
或
Task.Run(() => Login());
请注意,由于Login
是一种异步方法,您也可以直接调用它而不使用Task.Run
这样的方式(我假设您要解雇并忘记):
Login();