Так что я много раз пытался много проб и ошибок, и я не могу заставить это работать, в основном я хочу разархивировать zip-файл с помощью Ionic.DLL от http://dotnetzip.codeplex.com, как вы можете видеть, я также рассказал об этом здесь: Extract ZipFile Using C# With Progress Report, поэтому в основном подытожим то, что мне нужно.C# Фоновый работник с zipfile (Ionic.dll)
У меня есть форма с: 3xbuttons: btnCancel, btnBrowse и btnStart, 1xbackground работник: backgroundworker1 1xlabel: Label1 1xtextbox: textBox1 1xprogressbar
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Threading;
using System.Text;
using System.Windows.Forms;
using System.IO;
using Ionic.Zip;
namespace BackgroundWorkerSample
{
public partial class Form1 : Form
{
/// <summary>
/// The backgroundworker object on which the time consuming operation shall be executed
/// </summary>
BackgroundWorker m_oWorker;
public Form1()
{
InitializeComponent();
m_oWorker = new BackgroundWorker();
m_oWorker.DoWork += new DoWorkEventHandler(m_oWorker_DoWork);
m_oWorker.ProgressChanged += new ProgressChangedEventHandler(m_oWorker_ProgressChanged);
m_oWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(m_oWorker_RunWorkerCompleted);
m_oWorker.WorkerReportsProgress = true;
m_oWorker.WorkerSupportsCancellation = true;
}
/// <summary>
/// On completed do the appropriate task
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void m_oWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//If it was cancelled midway
if (e.Cancelled)
{
lblStatus.Text = "Task Cancelled.";
}
else if (e.Error != null)
{
lblStatus.Text = "Error while performing background operation.";
}
else
{
lblStatus.Text = "Task Completed...";
}
btnStartAsyncOperation.Enabled = true;
btnCancel.Enabled = false;
}
/// <summary>
/// Notification is performed here to the progress bar
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void m_oWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//Here you play with the main UI thread
progressBar1.Value = e.ProgressPercentage;
lblStatus.Text = "Processing......" + progressBar1.Value.ToString() + "%";
}
/// <summary>
/// Time consuming operations go here </br>
/// i.e. Database operations,Reporting
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void m_oWorker_DoWork(object sender, DoWorkEventArgs e)
{
//NOTE : Never play with the UI thread here...
//time consuming operation
for (int i = 0; i < 100; i++)
{
Thread.Sleep(100);
m_oWorker.ReportProgress(i);
/////////////////////MINEEEEEEEEEEEEEEEEEEEEEEEEE
string INSTALL_LOCATION = "C:" + @"\" + "Program Files (x86)" + @"\" + "TEST_FOLDER" + @"\" + @"\" + "Burgos_Folder";
string DEFAULT_LOCATION = "C:" + @"\" + "Program Files (x86)" + @"\" + "TEST_FOLDER" + @"\" + "test.rar";
if (!Directory.Exists(INSTALL_LOCATION))
{
Directory.CreateDirectory(INSTALL_LOCATION);
}
//if the textbox directory exists
if (Directory.Exists(INSTALL_LOCATION))
{
using (ZipFile zip = ZipFile.Read(DEFAULT_LOCATION))
{
zip.ExtractAll(INSTALL_LOCATION, ExtractExistingFileAction.OverwriteSilently);
}
}
//If cancel button was pressed while the execution is in progress
//Change the state from cancellation ---> cancel'ed
if (m_oWorker.CancellationPending)
{
e.Cancel = true;
m_oWorker.ReportProgress(0);
return;
}
}
//Report 100% completion on operation completed
m_oWorker.ReportProgress(100);
}
private void btnStartAsyncOperation_Click(object sender, EventArgs e)
{
btnStartAsyncOperation.Enabled = false;
btnCancel.Enabled = true;
//Start the async operation here
m_oWorker.RunWorkerAsync();
}
private void btnCancel_Click(object sender, EventArgs e)
{
if (m_oWorker.IsBusy)
{
//Stop/Cancel the async operation here
m_oWorker.CancelAsync();
}
}
}
}
Что я хотел бы мои WinForms иметь это просто: найдите папку, затем нажмите «Пуск» (btnStart), который запустит процесс извлечения zip, который также отображается на ProgressBar (timewise), а кнопка cancel (btnCancel) отменяет процесс распаковки, я успешно сделал все, но я не могу отработать, как отменить рассылку ss, он никогда не останавливается, если я фактически не закрываю .exe. Я решил сделать более простой пример без кнопки textbox и browse, и этот пример находится в моем предыдущем заданном вопросе (ссылка выше), но я не вижу, как реализовать способ отмены процесса распаковки с фоновым рабочим и я определенно должен использовать фонового работника, чтобы у меня был отчет о ходе текущей ситуации и т. д. Может ли кто-нибудь приспособить мои примеры или предоставить пример, который это делает?
Адаптировать, какие примеры? Вы должны опубликовать хороший пример кода с этим вопросом. См. Http://stackoverflow.com/help/mcve. Тем временем убедитесь, что вы используете событие 'ProgressChanged' и установили' WorkerReportsProgress' в 'true'. –
Вы уже знаете об ExtractProgressEventArgs, у него есть свойство Cancel. Так что это не займет ничего, кроме простого e.Cancel = backgroundWorker1.CancellationPending; –
Я добавил, что мои нынешние ребята из примера, мне было достаточно ссылки на мой другой вопрос с примером. – Burgo855