C# 这是异步void的正确用法吗?沙马林

C# 这是异步void的正确用法吗?沙马林,c#,xamarin,async-await,C#,Xamarin,Async Await,我正在测试Xamarin的功能,并试图将一个android项目转化为它。我有一个非常基本的登录使用facebook。我的代码如下所示: public class MainActivity : Activity, IFacebookCallback { private LoginButton loginButton; ICallbackManager callbackManager; protected override void OnCreate(Bundle

我正在测试Xamarin的功能,并试图将一个android项目转化为它。我有一个非常基本的登录使用facebook。我的代码如下所示:

  public class MainActivity : Activity, IFacebookCallback
  {
    private LoginButton loginButton;
    ICallbackManager callbackManager;

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.Main);

        loginButton = FindViewById<LoginButton>(Resource.Id.login_button);
        loginButton.SetReadPermissions(new List<string>() {"email"});

        this.callbackManager = CallbackManagerFactory.Create();
        loginButton.RegisterCallback(callbackManager, this);
    }        

    public async void OnSuccess(Java.Lang.Object result)
    {
        var loginResult = result as LoginResult;
        var accesstoken = loginResult.AccessToken;

        var client = new FacebookApiClient();

        var textview = FindViewById<TextView>(Resource.Id.emailDisplay);            

        try
        {           
            var fbResponse = await GetFaceBookResponse(accesstoken);
            textview.Text = fbResponse.Email;
        }
        catch(System.Exception ex)
        {
            var myException = ex;
        }                  
    }

    private async Task<FacebookResponse> GetFaceBookResponse(AccessToken accessToken)
    {
        var client = new FacebookApiClient();
        var response = await client.GetEmail(accessToken);
        return response;
    }
}
但我不确定为什么这会比我现在做的更好,或者这是否真的有什么不同

所以我在IFacebookCallback中实现OnSuccess方法,它需要一个void方法。这似乎是做到这一点的唯一方法,对我来说似乎没问题,而且似乎效果很好。但是,我知道,除非在特殊情况下(事件处理程序),否则不能将async与void返回类型一起使用。只是在这里仔细检查一下,以确保这不会引起任何问题

这正是你使用它的目的,所以它很好。只要您不想在自己的代码中的任何地方等待该方法(因为异步void方法不能等待,这就是为什么它们不能等待的原因),您就可以了


Microsoft的一个示例还包含一个简单的异步实现
IFacebookCallback.OnSuccess()
,。

您在哪里/如何使用
OnSuccess
        var cts = new CancellationTokenSource();
        var ct = cts.Token;
        try
        {
           var fbResponse = await Task.Run(async () =>
            {
                var response = await client.GetEmail(accesstoken);
                return response;
            }, ct);                

            textview.Text = fbResponse.Email;
        }