Я извлекаю 200 URL-адресов видео с YouTube. Но его замораживание моего приложения, как я могу заставить его работать, я использую его также в фоновом рабочем столе, но все еще не работаю.C# App замораживание при получении запроса на youtube
В этом я использовал фона рабочего, я хочу добавить названия видео в listBox2.
Initialized работник ..
worker1 = new BackgroundWorker();
worker1.DoWork += new DoWorkEventHandler(worker1_DoWork);
worker1.ProgressChanged += new ProgressChangedEventHandler(worker1_ProgressChanged);
worker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker1_RunWorkerCompleted);
worker1.WorkerReportsProgress = true;
worker1.WorkerSupportsCancellation = true;
int ii = 0;
int jj = 0;
Do работы функции.
void worker1_DoWork(object sender, DoWorkEventArgs e)
{
int progressVal = 0;
textBox1.Invoke(new Action(
delegate()
{
if (worker1.CancellationPending)
{ return; }
string[] videoLink = textBox1.Text.Split(new char[] { '\n' });
progressBar1.Maximum = videoLink.Length ;
foreach (string s in videoLink)
{
string videoID;
try
{
videoID = s.Split(new char[] { '=' })[1].Trim();
}
catch (Exception ex)
{
MessageBox.Show(this, "Please enter correct video links\nExample : http://www.youtube.com/watch?v=123456789", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
YouTubeRequestSettings reqSettings = new YouTubeRequestSettings("Youtube Comments", devkey, usernames[jj], password) { Timeout = -1 };
YouTubeRequest request = new YouTubeRequest(reqSettings);
jj++;
if (jj == usernames.Length) jj = 0;
string commentContent = listBox1.Items[ii].ToString();
ii++;
if (ii == listBox1.Items.Count) ii = 0;
Comment comment = new Comment();
comment.Content = commentContent;
try
{
Video video = request.Retrieve<Video>(new Uri("http://gdata.youtube.com/feeds/api/videos/" + videoID));
worker1.ReportProgress(progressVal++, "[" + comment.Content + "] Added to : " + "VideoTitle");
// request.AddComment(request.Retrieve<Video>(new Uri("http://gdata.youtube.com/feeds/api/videos/" + videoID)), comment);
}
catch (Exception ex)
{
worker1.ReportProgress(progressVal++, "Error Accoured : " + "VideoTitle");
}
}
}));
}
Я хочу, чтобы он прогрессировал каждый раз, когда добавлял заголовок в список, но только показывал прогресс в последнем. после завершения всего процесса.
void worker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
progressBar1.Value = progressBar1.Maximum;
this.Show();
}
void worker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
listBox2.Items.Add(e.UserState.ToString());
}
Можете ли вы также показать свой рабочий код рабочего стола? – paqogomez
@paqogomez Конечно. Отредактировано. –
Вы создали рабочий поток, но вы возвращаете работу обратно в поток пользовательского интерфейса, используя 'textBox1.Invoke' –