2012-10-15 41 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線程。 –