C# 调用任务时出错。请运行以创建异步进程

C# 调用任务时出错。请运行以创建异步进程,c#,.net,asynchronous,xamarin,async-await,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()

我一直在审阅一家应用开发公司在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(Login)”上出现错误


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

更改
登录的签名以返回
任务,如下所示:

async Task Login()
{
    //...
}
Task.Run( (Func<Task>) Login);
这样称呼它:

async Task Login()
{
    //...
}
Task.Run( (Func<Task>) Login);
请注意,由于
Login
是一种异步方法,因此您也可以直接调用它,而无需使用
Task。像这样运行
(我假设您想启动并忘记):


更改
登录
的签名以返回任务
,如下所示:

async Task Login()
{
    //...
}
Task.Run( (Func<Task>) Login);
这样称呼它:

async Task Login()
{
    //...
}
Task.Run( (Func<Task>) Login);
请注意,由于
Login
是一种异步方法,因此您也可以直接调用它,而无需使用
Task。像这样运行
(我假设您想启动并忘记):


使用
async
的方法有几个问题。我建议你读我的和

特别是,您应该遵循以下约定:

  • 不要使用
    ContinueWith
    。改用
    wait
  • 避免
    异步无效
    。使用
    async Task
    ,除非必须使用
    async void
  • 使用
    Task.Run
    将CPU绑定的工作推离UI线程。对于您的代码,没有理由使用
    任务。运行
结合这些,代码相当简化,并且具有更合理的语义(尤其是登录错误不会被默默忽略):


使用
async
的方法有几个问题。我建议你读我的和

特别是,您应该遵循以下约定:

  • 不要使用
    ContinueWith
    。改用
    wait
  • 避免
    异步无效
    。使用
    async Task
    ,除非必须使用
    async void
  • 使用
    Task.Run
    将CPU绑定的工作推离UI线程。对于您的代码,没有理由使用
    任务。运行
结合这些,代码相当简化,并且具有更合理的语义(尤其是登录错误不会被默默忽略):


登录
返回
任务
而不是
无效
。为什么要使用
任务。运行
?你想开枪然后忘记吗?如果
Login
抛出异常,您预计会发生什么?谢谢您的建议!您的回答对我的情况非常有效。让
登录
返回
任务
而不是
无效
。为什么要使用
任务。运行
?你想开枪然后忘记吗?如果
Login
抛出异常,您预计会发生什么?谢谢您的建议!你的回答很适合我的情况。