【发布时间】: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