c#winform Facebooksdk Post vs PostTaskAsync

时间:2012-10-15 16:45:47

标签: c# facebook winforms

我对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()”,但没有运气。

有任何建议可以处理此问题吗? 我可以使用另一个线程处理这张照片上传吗? 或?

感谢所有答案&评价。

2 个答案:

答案 0 :(得分:0)

您是否尝试过使用async / await?

下面显然是一个很小的例子,但请注意:

  • 该方法标有'async'
  • 返回类型是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 });
        }
    }
}

答案 1 :(得分: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 });
        }
    }

感谢您的所有建议。