在设计师中我提出了背景工作,我有两个事件:工作和进度改变。 我使用断点并进入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();
}
}
}
答案 0 :(得分:2)
您需要使用worker.ReportProgress()
来自MSDN:
如果您需要后台操作来报告其进度,那么您 可以调用ReportProgress方法来引发ProgressChanged事件。 WorkerReportsProgress属性值必须为true或 ReportProgress将抛出InvalidOperationException。
由您来实施一种有意义的衡量方法 后台操作的进度占总任务的百分比 完成。
对ReportProgress方法的调用是异步的并返回 立即。 ProgressChanged事件处理程序在线程上执行 创建了BackgroundWorker。
答案 1 :(得分:1)
您必须设置this。
backgroundWorker.WorkerReportsProgress = true;
获取或设置一个值,指示BackgroundWorker是否可以 报告进度更新。
修改强>
如果仍无法正常工作,请检查您是否在设计器代码中正确绑定了事件。或者只是在课堂上添加如下内容。
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
}