2014-03-24 128 views
1

我正在使用我從博客獲得的代碼塊,使用API​​ v3將圖像上傳到IMGur。獲取異步調用的進度

它工作正常,但我想實現一個進度條系統,讓用戶知道已經上傳了多少,如果該程序處理高分辨率圖像。

到目前爲止,我還沒有能夠這樣做。

我不是一個有經驗的編碼員,只是將其作爲一個學習項目來完成。

驗證碼:

public object UploadImage(string image) 
{ 
    WebClient w = new WebClient(); 
    w.UploadProgressChanged += (s, e) => { }; 
    w.UploadValuesCompleted += (s, e) => { }; 
    w.Headers.Add("Authorization", "Client-ID " + ClientId); 
    System.Collections.Specialized.NameValueCollection Keys = new System.Collections.Specialized.NameValueCollection(); 
    try 
    { 
     Keys.Add("image", Convert.ToBase64String(File.ReadAllBytes(image))); 
     byte[] responseArray = w.UploadValues("https://api.imgur.com/3/image", Keys); 


     dynamic result = Encoding.ASCII.GetString(responseArray); System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex("link\":\"(.*?)\""); 
     System.Text.RegularExpressions.Match match = reg.Match(result); 
     string url = match.ToString().Replace("link\":\"", "").Replace("\"", "").Replace("\\/", "/"); 
     textBox1.Text = url; 
     return url; 
    } 
    catch (Exception s) 
    { 
     MessageBox.Show("Something went wrong. " + s.Message); 
      return "Failed!"; 
    } 
} 

起初,我嘗試使用事件UploadProgressChangedUploadValuesCompleted,但他們不會被觸發,我的理論是,他們被觸發時UploadValuesAsync被調用,而不是UploadValues

  1. 如何實施進度系統?
  2. 異步和正常傳輸有什麼區別?

回答

2

異步傳輸與正常傳輸的區別在於,UploadValues方法將阻塞當前線程,直到所有數據傳輸完畢。由於此時線程被阻止,因此您無法捕獲任何事件。因此,您必須使用異步方法UploadValuesAsync,它將在後臺傳輸數據,並且可以繼續執行代碼。
UploadProgressChanged也只會觸發UploadValuesAsync。你的代碼應該是這個樣子(未測試!):

public String UploadImage(string image) 
    { 
     WebClient w = new WebClient(); 

     w.UploadProgressChanged += (s, e) => 
     { 
      myProgressBar.Maximum = (int)e.TotalBytesToSend; 
      myProgressBar.Value = (int)e.BytesSent; 
     }; 

     w.UploadValuesCompleted += new UploadValuesCompletedEventHandler(UploadComplete); 

     w.Headers.Add("Authorization", "Client-ID " + ClientId); 
     System.Collections.Specialized.NameValueCollection Keys = new System.Collections.Specialized.NameValueCollection(); 
     try 
     { 
      Keys.Add("image", Convert.ToBase64String(File.ReadAllBytes(image))); 
      w.UploadValuesAsync("https://api.imgur.com/3/image", Keys); 

      return "Uploading.."; 
     } catch (Exception s) 
     { 
      MessageBox.Show("Something went wrong. " + s.Message); 
       return "Failed!"; 
     } 
    } 

public void UploadComplete(Object sender, UploadValuesCompletedEventArgs e) 
{ 
    myProgressBar.Value = 100; 

    byte[] responseArray = e.Result; 
    dynamic result = Encoding.ASCII.GetString(responseArray); 
    System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex("link\":\"(.*?)\""); 
    System.Text.RegularExpressions.Match match = reg.Match(result); 
    string url = match.ToString().Replace("link\":\"", "").Replace("\"", "").Replace("\\/", "/"); 
    textBox1.Text = url; 
} 

編輯
我的UploadValuesAsync呼叫到w.UploadValuesCompleted後移的代碼。您可以在UploadValuesCompletedEventArgs類的Result字段中找到服務器響應,該字段在變量e中傳遞給事件。
您的方法UploadImage現在將返回上載當進度開始時,您必須在w.UploadValuesCompleted事件中完成您的休息工作。

+0

UploadValuesAsync返回void,而UploadValues返回一個字節數組,有什麼建議? – user2896358

+0

您可能需要在UploadValuesCompleated事件處理程序中的'UploadValuesAsync'調用之後移動代碼,並從'e.Result'中讀取結果。我一回家就會更新我的答案。 – Kimmax

+0

好吧,我現在更新了我的代碼,仍未測試。讓我知道如果這項工程 – Kimmax