使用C#访问Facebook API等待并永远停留

时间:2017-05-24 23:06:01

标签: c# facebook facebook-graph-api

我正在尝试实施Facebook登录并在c#项目中获取数据。 我要做的是用户按下他的名字和密码然后按下登录按钮然后登录然后它返回他的数据。 当我按下按钮时程序冻结。

这是我的项目实施

Account.cs

 public class Account
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public string Birthday { get; set; }
}

Facebook.client

public interface IFacebookClient
{
    Task<T> GetAsync<T>(string accessToken, string endpoint, string args = null);
    Task PostAsync(string accessToken, string endpoint, object data, string args = null);
}

public class FacebookClient : IFacebookClient
{
    private readonly HttpClient _httpClient;

    public FacebookClient()
    {
        _httpClient = new HttpClient
        {
            BaseAddress = new Uri("https://graph.facebook.com/v2.8/")
        };
        _httpClient.DefaultRequestHeaders
            .Accept
            .Add(new MediaTypeWithQualityHeaderValue("application/json"));
    }

    public async Task<T> GetAsync<T>(string accessToken, string endpoint, string args = null)
    {
        var response = await _httpClient.GetAsync($"{endpoint}?access_token={accessToken}&{args}");
        if (!response.IsSuccessStatusCode)
            return default(T);

        var result = await response.Content.ReadAsStringAsync();

        return JsonConvert.DeserializeObject<T>(result);
    }

    public async Task PostAsync(string accessToken, string endpoint, object data, string args = null)
    {
        var payload = GetPayload(data);
        await _httpClient.PostAsync($"{endpoint}?access_token={accessToken}&{args}", payload);
    }

    private static StringContent GetPayload(object data)
    {
        var json = JsonConvert.SerializeObject(data);

        return new StringContent(json, Encoding.UTF8, "application/json");
    }
}

FacebookService.cs

public interface IFacebookService
{
    Task<Account> GetAccountAsync(string accessToken);
    Task PostOnWallAsync(string accessToken, string message);
}

public class FacebookService : IFacebookService
{
    private readonly IFacebookClient _facebookClient;

    public FacebookService(IFacebookClient facebookClient)
    {
        _facebookClient = facebookClient;
    }

    public async Task<Account> GetAccountAsync(string accessToken)
    {
        var result = await _facebookClient.GetAsync<dynamic>(
            accessToken, "me", "fields=id,name,birthday,email");

        if (result == null)
        {
            return new Account();
        }

        var account = new Account
        {
            Id = result.id,
            Email = result.email,
            Name = result.name,
            Birthday = result.Birthday
        };

        return account;
    }
    public async Task PostOnWallAsync(string accessToken, string message)
        => await _facebookClient.PostAsync(accessToken, "me/feed", new {message});
}  

FacebookSettings.cs

var facebookClient = new FacebookClient();
        var facebookService = new FacebookService(facebookClient);
        var getAccountTask = facebookService.GetAccountAsync(FacebookSettings.AccessToken);
        Task.WaitAll(getAccountTask);
        var account = getAccountTask.Result;
        Console.WriteLine($"{account.Id} {account.Name}");

登录表单按钮

private void btn_facebook_Click(object sender, EventArgs e)
    {
        var facebookClient = new FacebookClient();
        var facebookService = new FacebookService(facebookClient);
        var getAccountTask = facebookService.GetAccountAsync(FacebookSettings.AccessToken);
        Task.WaitAll(getAccountTask);
        var account = getAccountTask.Result;
        //Console.WriteLine($"{account.Id} {account.Name}");
    }

它在等待

上停留在这一行
 public async Task<Account> GetAccountAsync(string accessToken)
    {
        var result = await _facebookClient.GetAsync<dynamic>(accessToken, "me", "fields=id,name,birthday,email");

        if (result == null)
        {
            return new Account();
        }

        var account = new Account
        {
            Id = result.id,
            Email = result.email,
            Name = result.name,
            Birthday = result.Birthday
        };

        return account;
    }

在这一行

            var result = await _facebookClient.GetAsync<dynamic>(accessToken, "me", "fields=id,name,birthday,email");

1 个答案:

答案 0 :(得分:1)

这是你的问题:

Task.WaitAll(getAccountTask);

Don't block on async code。请改用await

private async void btn_facebook_Click(object sender, EventArgs e)
{
  var facebookClient = new FacebookClient();
  var facebookService = new FacebookService(facebookClient);
  var account = await facebookService.GetAccountAsync(FacebookSettings.AccessToken);
}