2014-03-24 60 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