2011-09-21 2 views
0

Dans le concepteur j'ai mis en arrière-plan et j'ai deux événements: Do Work et Progress Changed. J'ai utilisé le point d'arrêt et son accès à l'événement Do Work, mais il n'entrait jamais dans l'événement Progress Changed. Il ne s'arrête jamais là comme l'événement ne fonctionne pas. Pourquoi le progrss a-t-il changé d'événement?Im essayant d'utiliser backgroundworker je veux voir la progression du téléchargement, mais il fonctionne dosent pourquoi?

Voici le code:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using Google.GData.Client; 
using Google.GData.Extensions; 
using Google.GData.Extensions.MediaRss; 
using Google.GData.YouTube; 
using Google.YouTube; 
using System.Threading; 



namespace YoutubeTesting 
{ 
    public partial class Form1 : Form 
    { 
     YouTubeRequestSettings settings; 
     YouTubeRequest request; 
     string devkey = "AI39si6xhSQXx95FTYIACWPfq-lLIphblgaReuz9z6VEjR1Q6YjrV6FRN2U6FN6P6-lGF2OYaUZhCVOKJ_MCk4o6kPeUszvf5A"; 
     string username = "[email protected]"; 
     string password = "password"; 

     public Form1() 
     { 
      InitializeComponent(); 
      worker.RunWorkerAsync(); 
     } 




     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 

     private void upload() 
     { 
      try 
      { 
       settings = new YouTubeRequestSettings("You Manager", devkey, username, password); 
       settings.Timeout = -1; 
       request = new YouTubeRequest(settings); 
       Video video = new Video(); 
       video.Title = "test"; 
       video.Tags.Add(new MediaCategory("Comedy", YouTubeNameTable.CategorySchema)); 
       video.Keywords = "Comedy"; 
       video.Private = false; 
       video.MediaSource = new MediaFileSource("d:\\VIDEO0037.3gp", "video/3gp"); 
       request.Upload(video); 
       MessageBox.Show("Successfully Uploaded"); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 

     private void worker_DoWork(object sender, DoWorkEventArgs e) 
     { 
      upload(); 
     } 

     private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
     { 
      textBox1.Text = e.ProgressPercentage.ToString(); 
     } 
    } 
} 
+3

Qu'est-ce que vous avez en ce moment qui est supposé déclencher un ProgressChangedEvent? Je pense que votre problème est que vous travaillez peut-être sous l'impression erronée que request.Upload va magiquement invoquer ceci pour vous, en quelque sorte. – Kevek

+0

Kevek pouvez-vous me montrer un exemple sur mon code puis comment le faire? Merci. –

+0

@DanielLip: Si votre demande YouTubeRequest ne vous permet pas de progresser, vous ne pourrez pas le faire de manière significative. – BrokenGlass

Répondre

2

Vous devez signaler les progrès en utilisant worker.ReportProgress()

De MSDN:

Si vous avez besoin de l'opération d'arrière-plan pour rendre compte de ses progrès, vous peut appeler la méthode ReportProgress pour déclencher l'événement ProgressChanged. La valeur de la propriété WorkerReportsProgress doit être true ou ReportProgress lève une exception InvalidOperationException. C'est à vous de mettre en œuvre une manière significative de mesurer votre progression de l'opération de fond en pourcentage de la tâche totale terminée.

L'appel à la méthode ReportProgress est asynchrone et renvoie immédiatement. Le gestionnaire d'événements ProgressChanged s'exécute sur le thread qui a créé BackgroundWorker.

1

Vous devez définir this.

backgroundWorker.WorkerReportsProgress = true; 

Obtient ou définit une valeur indiquant si le BackgroundWorker peut Rapport d'avancement des mises à jour.

enter image description here

EDIT

Si les contrôles ne fonctionne toujours pas si vous avez lier l'événement correctement dans le code de concepteur. Ou ajoutez simplement quelque chose comme ci-dessous dans votre classe.

backgroundWorker1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.worker_ProgressChanged); 

Dans votre méthode de téléchargement, vous devez signaler la progression. Sinon, l'événement ci-dessus ne se déclenchera pas. Gardez à l'esprit qu'il n'est pas toujours facile de signaler les progrès réels.

Voici un exemple de code pour une méthode DoWork. Regardez here si vous voulez voir un exemple complet.

static void bw_DoWork (object sender, DoWorkEventArgs e) 
    { 
    for (int i = 0; i <= 100; i += 20) 
    { 
     if (_bw.CancellationPending) { e.Cancel = true; return; } 
     _bw.ReportProgress (i); 
     Thread.Sleep (1000);  // Just for the demo... don't go sleeping 
    }       // for real in pooled threads! 

    e.Result = 123; // This gets passed to RunWorkerCompleted 
    } 
+0

Je l'ai changé en true dans le concepteur de la propriété worker.Et maintenant j'ai ajouté cette ligne au constructeur et ça ne marche toujours pas. –

+0

@DanielLip: vous devez signaler votre progression en utilisant 'ReportProgress (somePercentage)' depuis votre méthode de travail – BrokenGlass

+0

@DanielLip: Voir mes modifications. vous devez appeler backgroundWorker.ReportProgress si vous ne le faites pas dans la méthode Update. – CharithJ

Questions connexes