我试图使用backgroundworker我想看到上传进度,但它不起作用为什么?

时间:2011-09-21 22:40:21

标签: c#

在设计师中我提出了背景工作,我有两个事件:工作和进度改变。 我使用断点并进入Do Work事件,但它从未进入Progress Changed事件。它永远不会停止在那里,因为事件不起作用。为什么改变事件的进展不起作用?

这是代码:

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 = "chocolade13091972@gmail.com";
        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();
        }
     }
}

2 个答案:

答案 0 :(得分:2)

您需要使用worker.ReportProgress()

报告进度

来自MSDN

  

如果您需要后台操作来报告其进度,那么您   可以调用ReportProgress方法来引发ProgressChanged事件。   WorkerReportsProgress属性值必须为true或   ReportProgress将抛出InvalidOperationException。

     

由您来实施一种有意义的衡量方法   后台操作的进度占总任务的百分比   完成。

     

对ReportProgress方法的调用是异步的并返回   立即。 ProgressChanged事件处理程序在线程上执行   创建了BackgroundWorker。

答案 1 :(得分:1)

您必须设置this

backgroundWorker.WorkerReportsProgress = true;
  

获取或设置一个值,指示BackgroundWorker是否可以   报告进度更新。

enter image description here

修改

如果仍无法正常工作,请检查您是否在设计器代码中正确绑定了事件。或者只是在课堂上添加如下内容。

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

在您的上传方法中,您必须报告进度。否则以上事件不会触发。请记住,始终报告实际进度并不容易。

以下是DoWork方法的示例代码。如果你想看一个完整的例子,请看here

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
  }