调用Task.Run以创建异步进程时出错

时间:2016-02-03 17:31:20

标签: c# .net asynchronous xamarin async-await

我一直在审查应用开发公司在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

我可以更改某些东西,以便我可以在我的机器上编译应用程序吗?

2 个答案:

答案 0 :(得分:4)

您对async的处理方式存在一些问题。我建议您阅读我的async intro blog postasync 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();