0

我对 facebooksdk 很陌生,但是我在 c# 中有一个 winform 项目,可以使用它执行简单的状态发布和照片上传。

到目前为止,SDK 做得很好,但是,FacebookClient.Post 和 FacebookClient.PostTaskAync 之间有什么区别?

我使用以下代码将照片发布到我的 Facebook 帐户:

public static void uploadPhoto(string fPath, string userMsg, string imgType = "")
{
    var fb = new FacebookClient(AccessToken);
    if (imgType.Equals(""))
        imgType = "image/jpeg";

    using (var file = new FacebookMediaStream
    {
        ContentType = imgType,
        FileName = Path.GetFileName(fPath)
    }.SetValue(File.OpenRead(fPath)))
    {
        dynamic result = fb.Post("me/photos",
            new { message = userMsg, file });
    }
}

但是,当文件很大时,上述方法会“挂起”我的系统,因为主线程仍在工作,所以我尝试了以下方法:

dynamic result = fb.PostTaskAsync("me/photos",
                  new { message = userMsg, file });

但它只是不起作用(至少照片没有上传到我的fb帐户)......

我实际上想要的是避免系统上出现“挂起”的感觉,我什至尝试过“Application.DoEvents()”,但没有运气。

有什么建议可以解决这个问题吗?我应该使用另一个线程来处理这张照片上传吗?或者?

感谢所有的答案和评论。

4

2 回答 2

0

您是否尝试过使用异步/等待?

显然,下面是一个非常小的示例,但请注意:

  • 该方法被标记为“异步”
  • 返回类型是 Task (或 Task < T > )
  • facebook 方法更改为:'await fb.PostTaskAsync('

这意味着结果仅在完成后才被封送回 UI 线程,并且您的 UI 将保持响应。请参阅:http: //msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.Load += OnLoad;
    }

    private const string AccessToken = "xxxxxxxxxxxxxx";
    private const string imgType = "image/jpeg";
    private const string fPath = "c:\bob.jpg";
    private const string userMsg = "My Message";

    private async void OnLoad(object sender, EventArgs e)
    {
        await DoSomething();
    }

    private async Task DoSomething()
    { 
        var fb = new FacebookClient(AccessToken);

        using (var file = new FacebookMediaStream
        {
            ContentType = imgType,
            FileName = Path.GetFileName(fPath)
        }.SetValue(File.OpenRead(fPath)))
        {
            dynamic result = await fb.PostTaskAsync("me/photos",
                new { message = userMsg, file });
        }
    }
}
于 2012-10-15T17:18:37.723 回答
0

看来我设法在我的 VS2010 .net4.0 上使用 System.Threading.Tasks 处理它,如下所示:

    // For Tasks
    private static Task _taskUpload = null;
    private static string _fPath = "";
    private static string _userMsg = "";
    private static string _imgType = "";

    /// <summary>
    /// used to post photo to facebook
    /// </summary>
    /// <param name="fPath"></param>
    /// <param name="userMsg"></param>
    /// <param name="imgType"></param>
    public static void uploadPhoto(string filePath, string userMsg, string imgType = "")
    {
        // Assign Values
        _fPath = filePath;
        _userMsg = userMsg;
        _imgType = imgType;

        // Start Task
        _taskUpload = Task.Factory.StartNew(new Action(processUploadPhoto));

    }

    /// <summary>
    /// Used to process actual upload of photo to FB
    /// </summary>
    private static void processUploadPhoto()
    {
        var fb = new FacebookClient(AccessToken);
        if (_imgType.Equals(""))
            _imgType = "image/jpeg";

        using (var file = new FacebookMediaStream
        {
            ContentType = _imgType,
            FileName = Path.GetFileName(_fPath)
        }.SetValue(File.OpenRead(_fPath)))
        {
            dynamic result = fb.Post("me/photos",
                new { message = _userMsg, file });
        }
    }

感谢您的所有建议。

于 2012-10-16T15:33:26.777 回答