gpt4 book ai didi

c# - 这是对 async void 的正确使用吗?赛马林

转载 作者:行者123 更新时间:2023-11-30 21:35:10 24 4
gpt4 key购买 nike

我正在测试 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;
}

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

最佳答案

So I'm implementing the OnSuccess method in IFacebookCallback, which requires a void method. This appears to be the only way to do this, which seems ok to me and also appears to be working fine. However, I know it's a no-no to use async with a void return type, except in special situations (event handlers). Just double checking here to make sure this won't cause any problems?

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

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

关于c# - 这是对 async void 的正确使用吗?赛马林,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49470182/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com