2012-10-15 43 views
0

我很新的facebooksdk,但我有一个C#的winform项目来执行简单的状态发布&使用它上传照片。c#winform Facebooksdk发布与PostTaskAsync

到目前为止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帐号)...

什么其实我想是为了避免“韩ging“感觉,我甚至尝试过”Application.DoEvents()“,但没有运气。

任何建议来处理这个问题? 我应该使用另一个线程来处理这张照片上传? 或?

感谢所有的答案&评论。

+1

上面的'dynamic result = fb.PostTaskAsync'应该是'dynamic result = await fb.PostTaskAsync',因为PostTaskAsync的返回值是一个Task,而不是返回对象。添加await将异步产生返回对象。 –

+0

亲爱的乔恩,请阅读我关于VS2010 SP1,.net 4.0上关于await/async的评论。谢谢 –

回答

0

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

下面显然相当小例子,但要注意:

  • 该方法被标记有“异步”
  • 返回类型是任务(或任务< T>)
  • facebook的方法是改为:“等待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 }); 
     } 
    } 
} 
+0

请注意,这些关键字仅在最近发布的.NET版本中可用。如果您使用的是旧版本,则需要在“任务”上使用该方法明确返回的延续。 – Servy

+0

亲爱的乔恩,我看到了await&async方法,但我找不到任何支持VS2010 SP1 .NET 4.0中的await/async的库。任何想法? –

+0

嗨Servy,我试图使用任务来处理这种情况下,但有什么我需要照顾的任务状态?这样问是因为我在单例类中使用了Task。在调用此功能时,是否需要创建一个新任务?请指教。谢谢。 –

0

看来,我设法使用System.Threading.Tasks我VS2010 .net4.0与如下处理它:

// 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 }); 
     } 
    } 

感谢您的建议。

+0

Yup - Task.Factory.StartNew将启动一个新的异步背景对ThreadPool的操作。请注意,如果您需要从此后台工作人员任务更新您的用户界面,则需要将UI控件更新分发回UI线程。 –