【问题标题】:Is this a correct use of async void? Xamarin这是 async void 的正确使用吗?赛马林
【发布时间】:2018-03-24 21:34:46
【问题描述】:

我正在测试 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 返回类型一起使用是不可以的,除非在特殊情况下(事件处理程序)。只是在这里仔细检查以确保这不会造成任何问题?

另外,如果有更好的方法来做到这一点,它是什么?当我在谷歌搜索时,我找到了一种使用 Task.Run 的方法:

        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;
        }

但我不确定为什么这会比我正在做的更好,或者它实际上是否真的有任何不同。

【问题讨论】:

  • 您在哪里/如何使用OnSuccess?

标签: c# xamarin async-await


【解决方案1】:

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

这正是您使用它的目的,所以没关系。只要您不尝试在自己的代码中的任何地方等待该方法(因为无法等待 async void 方法,这就是它们被禁止的原因),您就很好。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    相关资源
    最近更新 更多