[
  {
    "Id": "443311",
    "ThreadId": "212765",
    "Html": "<p>I'm trying to modify one of the examples to zip a single file rather than a whole folder.<br>Im getting cross thread exeptions while trying to update the label with the current % and the final compression ratio (Same as original examples)</p>\r\n<p>I've removed everything except the kickoff button, progressbar2, status label and Cancel button.</p>\r\n<p>So far I have:</p>\r\n<p>&nbsp;</p>\r\n<div style=\"color:black;background-color:white\">\r\n<pre><span style=\"color:blue\">Imports</span> System.IO\r\n<span style=\"color:blue\">Imports</span> Ionic.Zip\r\n<span style=\"color:blue\">Imports</span> System.Threading\r\n\r\n<span style=\"color:blue\">Public</span> <span style=\"color:blue\">Class</span> Form1\r\n    <span style=\"color:green\">' Delegates for invocation of UI from other threads</span>\r\n    <span style=\"color:blue\">Private</span> <span style=\"color:blue\">Delegate</span> <span style=\"color:blue\">Sub</span> SaveEntryProgress(<span style=\"color:blue\">ByVal</span> e <span style=\"color:blue\">As</span> SaveProgressEventArgs)\r\n    <span style=\"color:blue\">Private</span> <span style=\"color:blue\">Delegate</span> <span style=\"color:blue\">Sub</span> ButtonClick(<span style=\"color:blue\">ByVal</span> sender <span style=\"color:blue\">As</span> <span style=\"color:blue\">Object</span>, <span style=\"color:blue\">ByVal</span> e <span style=\"color:blue\">As</span> EventArgs)\r\n\r\n    <span style=\"color:blue\">Private</span> _workerThread <span style=\"color:blue\">As</span> Thread\r\n    <span style=\"color:blue\">Private</span> _saveCanceled <span style=\"color:blue\">As</span> <span style=\"color:blue\">Boolean</span>\r\n    <span style=\"color:blue\">Private</span> _totalBytesAfterCompress <span style=\"color:blue\">As</span> <span style=\"color:blue\">Long</span>\r\n    <span style=\"color:blue\">Private</span> _totalBytesBeforeCompress <span style=\"color:blue\">As</span> <span style=\"color:blue\">Long</span>\r\n    <span style=\"color:green\">'Private _nFilesCompleted As Integer</span>\r\n    <span style=\"color:blue\">Private</span> _progress2MaxFactor <span style=\"color:blue\">As</span> <span style=\"color:blue\">Integer</span>\r\n    <span style=\"color:green\">'Private _entriesToZip As Integer</span>\r\n\r\n    <span style=\"color:blue\">Private</span> <span style=\"color:blue\">Sub</span> Button2_Click(<span style=\"color:blue\">ByVal</span> sender <span style=\"color:blue\">As</span> System.Object, <span style=\"color:blue\">ByVal</span> e <span style=\"color:blue\">As</span> System.EventArgs) <span style=\"color:blue\">Handles</span> btnZipUp.Click\r\n        <span style=\"color:blue\">Me</span>.KickoffZipup()\r\n    <span style=\"color:blue\">End</span> <span style=\"color:blue\">Sub</span>\r\n\r\n\r\n    <span style=\"color:blue\">Private</span> <span style=\"color:blue\">Sub</span> KickoffZipup()\r\n        <span style=\"color:blue\">Dim</span> fileName <span style=\"color:blue\">As</span> <span style=\"color:blue\">String</span> = <span style=\"color:#a31515\">&quot;C:\\Test\\test.txt&quot;</span>\r\n        <span style=\"color:blue\">Me</span>._saveCanceled = <span style=\"color:blue\">False</span>\r\n        <span style=\"color:blue\">Me</span>._totalBytesAfterCompress = 0\r\n        <span style=\"color:blue\">Me</span>._totalBytesBeforeCompress = 0\r\n        <span style=\"color:blue\">Me</span>.btnZipUp.Enabled = <span style=\"color:blue\">False</span>\r\n        <span style=\"color:blue\">Me</span>.btnZipUp.Text = <span style=\"color:#a31515\">&quot;Zipping...&quot;</span>\r\n        <span style=\"color:blue\">Me</span>.btnCancel.Enabled = <span style=\"color:blue\">True</span>\r\n        <span style=\"color:blue\">Me</span>.lblStatus.Text = <span style=\"color:#a31515\">&quot;Zipping...&quot;</span>\r\n        <span style=\"color:blue\">Dim</span> options <span style=\"color:blue\">As</span> <span style=\"color:blue\">New</span> WorkerOptions\r\n        options.ZipName = <span style=\"color:#a31515\">&quot;C:\\Test\\Ziptest.zip&quot;</span>\r\n        options.File = fileName\r\n        <span style=\"color:blue\">Me</span>._workerThread = <span style=\"color:blue\">New</span> Thread(<span style=\"color:blue\">AddressOf</span> DoSave)\r\n        <span style=\"color:blue\">Me</span>._workerThread.Name = <span style=\"color:#a31515\">&quot;Zip Saver thread&quot;</span>\r\n        <span style=\"color:blue\">Me</span>._workerThread.Start(options)\r\n        <span style=\"color:blue\">Me</span>.Cursor = Cursors.WaitCursor\r\n    <span style=\"color:blue\">End</span> <span style=\"color:blue\">Sub</span>\r\n\r\n    <span style=\"color:blue\">Private</span> <span style=\"color:blue\">Sub</span> DoSave(<span style=\"color:blue\">ByVal</span> p <span style=\"color:blue\">As</span> <span style=\"color:blue\">Object</span>)\r\n        <span style=\"color:blue\">Dim</span> options <span style=\"color:blue\">As</span> WorkerOptions = TryCast(p, WorkerOptions)\r\n        <span style=\"color:blue\">Try</span>\r\n            <span style=\"color:blue\">Using</span> zip1 <span style=\"color:blue\">As</span> ZipFile = <span style=\"color:blue\">New</span> ZipFile\r\n                zip1.AddFile(options.File)\r\n                <span style=\"color:blue\">Me</span>.SetProgressBars()\r\n                <span style=\"color:blue\">AddHandler</span> zip1.SaveProgress, <span style=\"color:blue\">New</span> EventHandler(Of SaveProgressEventArgs)(<span style=\"color:blue\">AddressOf</span> <span style=\"color:blue\">Me</span>.zip1_SaveProgress)\r\n                zip1.Save(options.ZipName)\r\n            <span style=\"color:blue\">End</span> <span style=\"color:blue\">Using</span>\r\n        <span style=\"color:blue\">Catch</span> exc1 <span style=\"color:blue\">As</span> Exception\r\n            MessageBox.Show(<span style=\"color:blue\">String</span>.Format(<span style=\"color:#a31515\">&quot;Exception while zipping: {0}&quot;</span>, exc1.Message))\r\n            <span style=\"color:blue\">Me</span>.btnCancel_Click(<span style=\"color:blue\">Nothing</span>, <span style=\"color:blue\">Nothing</span>)\r\n        <span style=\"color:blue\">End</span> <span style=\"color:blue\">Try</span>\r\n    <span style=\"color:blue\">End</span> <span style=\"color:blue\">Sub</span>\r\n\r\n    <span style=\"color:blue\">Private</span> <span style=\"color:blue\">Sub</span> zip1_SaveProgress(<span style=\"color:blue\">ByVal</span> sender <span style=\"color:blue\">As</span> <span style=\"color:blue\">Object</span>, <span style=\"color:blue\">ByVal</span> e <span style=\"color:blue\">As</span> SaveProgressEventArgs)\r\n        <span style=\"color:blue\">Select</span> <span style=\"color:blue\">Case</span> e.EventType\r\n            <span style=\"color:blue\">Case</span> ZipProgressEventType.Saving_AfterWriteEntry\r\n                <span style=\"color:blue\">Me</span>.StepArchiveProgress(e)\r\n                <span style=\"color:blue\">Exit</span> <span style=\"color:blue\">Select</span>\r\n            <span style=\"color:blue\">Case</span> ZipProgressEventType.Saving_Completed\r\n                <span style=\"color:blue\">Me</span>.SaveCompleted()\r\n                <span style=\"color:blue\">Exit</span> <span style=\"color:blue\">Select</span>\r\n            <span style=\"color:blue\">Case</span> ZipProgressEventType.Saving_EntryBytesRead\r\n                <span style=\"color:blue\">Me</span>.StepEntryProgress(e)\r\n                <span style=\"color:blue\">Exit</span> <span style=\"color:blue\">Select</span>\r\n        <span style=\"color:blue\">End</span> <span style=\"color:blue\">Select</span>\r\n        <span style=\"color:blue\">If</span> <span style=\"color:blue\">Me</span>._saveCanceled <span style=\"color:blue\">Then</span>\r\n            e.Cancel = <span style=\"color:blue\">True</span>\r\n        <span style=\"color:blue\">End</span> <span style=\"color:blue\">If</span>\r\n    <span style=\"color:blue\">End</span> <span style=\"color:blue\">Sub</span>\r\n\r\n\r\n\r\n    <span style=\"color:blue\">Private</span> <span style=\"color:blue\">Sub</span> StepArchiveProgress(<span style=\"color:blue\">ByVal</span> e <span style=\"color:blue\">As</span> SaveProgressEventArgs)\r\n        <span style=\"color:blue\">If</span> <span style=\"color:blue\">Not</span> <span style=\"color:blue\">Me</span>._saveCanceled <span style=\"color:blue\">Then</span>\r\n            <span style=\"color:blue\">Me</span>._totalBytesAfterCompress = (<span style=\"color:blue\">Me</span>._totalBytesAfterCompress + e.CurrentEntry.CompressedSize)\r\n            <span style=\"color:blue\">Me</span>._totalBytesBeforeCompress = (<span style=\"color:blue\">Me</span>._totalBytesBeforeCompress + e.CurrentEntry.UncompressedSize)\r\n            <span style=\"color:blue\">Me</span>.ProgressBar2.Value = <span style=\"color:blue\">Me</span>.ProgressBar2.Maximum = 1\r\n            <span style=\"color:blue\">MyBase</span>.Update()\r\n        <span style=\"color:blue\">End</span> <span style=\"color:blue\">If</span>\r\n    <span style=\"color:blue\">End</span> <span style=\"color:blue\">Sub</span>\r\n\r\n\r\n    <span style=\"color:blue\">Private</span> <span style=\"color:blue\">Sub</span> SaveCompleted()\r\n        <span style=\"color:blue\">If</span> <span style=\"color:blue\">Me</span>.lblStatus.InvokeRequired <span style=\"color:blue\">Then</span>\r\n            <span style=\"color:blue\">Me</span>.lblStatus.Invoke(<span style=\"color:blue\">New</span> MethodInvoker(<span style=\"color:blue\">AddressOf</span> SaveCompleted))\r\n        <span style=\"color:blue\">Else</span>\r\n            MessageBox.Show(<span style=\"color:blue\">Me</span>._totalBytesBeforeCompress)\r\n            MessageBox.Show(<span style=\"color:blue\">Me</span>._totalBytesAfterCompress)\r\n            <span style=\"color:blue\">Me</span>.lblStatus.Text = <span style=\"color:blue\">String</span>.Format(<span style=\"color:#a31515\">&quot;Done, Compressed to, {1:N0}% of original&quot;</span>, ((100 * <span style=\"color:blue\">Me</span>._totalBytesAfterCompress) / <span style=\"color:blue\">CDbl</span>(<span style=\"color:blue\">Me</span>._totalBytesBeforeCompress)))\r\n            <span style=\"color:blue\">Me</span>.ResetState()\r\n        <span style=\"color:blue\">End</span> <span style=\"color:blue\">If</span>\r\n    <span style=\"color:blue\">End</span> <span style=\"color:blue\">Sub</span>\r\n\r\n\r\n    <span style=\"color:blue\">Private</span> <span style=\"color:blue\">Sub</span> StepEntryProgress(<span style=\"color:blue\">ByVal</span> e <span style=\"color:blue\">As</span> SaveProgressEventArgs)\r\n        <span style=\"color:blue\">If</span> <span style=\"color:blue\">Me</span>.ProgressBar2.InvokeRequired <span style=\"color:blue\">Then</span>\r\n            <span style=\"color:blue\">Me</span>.ProgressBar2.Invoke(<span style=\"color:blue\">New</span> SaveEntryProgress(<span style=\"color:blue\">AddressOf</span> <span style=\"color:blue\">Me</span>.StepEntryProgress), <span style=\"color:blue\">New</span> <span style=\"color:blue\">Object</span>() {e})\r\n        <span style=\"color:blue\">ElseIf</span> <span style=\"color:blue\">Not</span> <span style=\"color:blue\">Me</span>._saveCanceled <span style=\"color:blue\">Then</span>\r\n            <span style=\"color:blue\">If</span> (<span style=\"color:blue\">Me</span>.ProgressBar2.Maximum = 1) <span style=\"color:blue\">Then</span>\r\n                <span style=\"color:blue\">Dim</span> entryMax <span style=\"color:blue\">As</span> <span style=\"color:blue\">Long</span> = e.TotalBytesToTransfer\r\n                <span style=\"color:blue\">Dim</span> absoluteMax <span style=\"color:blue\">As</span> <span style=\"color:blue\">Long</span> = &amp;H7FFFFFFF\r\n                <span style=\"color:blue\">Me</span>._progress2MaxFactor = 0\r\n                <span style=\"color:blue\">Do</span> <span style=\"color:blue\">While</span> (entryMax &gt; absoluteMax)\r\n                    entryMax = (entryMax / 2)\r\n                    <span style=\"color:blue\">Me</span>._progress2MaxFactor += 1\r\n                <span style=\"color:blue\">Loop</span>\r\n                <span style=\"color:blue\">If</span> (<span style=\"color:blue\">CInt</span>(entryMax) &lt; 0) <span style=\"color:blue\">Then</span>\r\n                    entryMax = (entryMax * -1)\r\n                <span style=\"color:blue\">End</span> <span style=\"color:blue\">If</span>\r\n                <span style=\"color:blue\">Me</span>.ProgressBar2.Maximum = <span style=\"color:blue\">CInt</span>(entryMax)\r\n                <span style=\"color:green\">'Me.lblStatus.Text = String.Format(&quot;{0} of {1} files...({2})&quot;, (Me._nFilesCompleted + 1), Me._entriesToZip, e.CurrentEntry.FileName)</span>\r\n            <span style=\"color:blue\">End</span> <span style=\"color:blue\">If</span>\r\n            <span style=\"color:blue\">Dim</span> xferred <span style=\"color:blue\">As</span> <span style=\"color:blue\">Integer</span> = <span style=\"color:blue\">CInt</span>((e.BytesTransferred &gt;&gt; <span style=\"color:blue\">Me</span>._progress2MaxFactor))\r\n            <span style=\"color:blue\">Me</span>.ProgressBar2.Value = IIf((xferred &gt;= <span style=\"color:blue\">Me</span>.ProgressBar2.Maximum), <span style=\"color:blue\">Me</span>.ProgressBar2.Maximum, xferred)\r\n            <span style=\"color:blue\">MyBase</span>.Update()\r\n        <span style=\"color:blue\">End</span> <span style=\"color:blue\">If</span>\r\n    <span style=\"color:blue\">End</span> <span style=\"color:blue\">Sub</span>\r\n\r\n    <span style=\"color:blue\">Private</span> <span style=\"color:blue\">Sub</span> btnCancel_Click(<span style=\"color:blue\">ByVal</span> sender <span style=\"color:blue\">As</span> System.Object, <span style=\"color:blue\">ByVal</span> e <span style=\"color:blue\">As</span> System.EventArgs) <span style=\"color:blue\">Handles</span> btnCancel.Click\r\n        <span style=\"color:blue\">If</span> <span style=\"color:blue\">Me</span>.lblStatus.InvokeRequired <span style=\"color:blue\">Then</span>\r\n            <span style=\"color:blue\">Me</span>.lblStatus.Invoke(<span style=\"color:blue\">New</span> ButtonClick(<span style=\"color:blue\">AddressOf</span> <span style=\"color:blue\">Me</span>.btnCancel_Click), <span style=\"color:blue\">New</span> <span style=\"color:blue\">Object</span>() {sender, e})\r\n        <span style=\"color:blue\">Else</span>\r\n            <span style=\"color:blue\">Me</span>._saveCanceled = <span style=\"color:blue\">True</span>\r\n            <span style=\"color:blue\">Me</span>.lblStatus.Text = <span style=\"color:#a31515\">&quot;Canceled...&quot;</span>\r\n            <span style=\"color:blue\">Me</span>.ResetState()\r\n        <span style=\"color:blue\">End</span> <span style=\"color:blue\">If</span>\r\n    <span style=\"color:blue\">End</span> <span style=\"color:blue\">Sub</span>\r\n\r\n    <span style=\"color:blue\">Private</span> <span style=\"color:blue\">Sub</span> ResetState()\r\n        <span style=\"color:blue\">Me</span>.btnCancel.Enabled = <span style=\"color:blue\">False</span>\r\n        <span style=\"color:blue\">Me</span>.btnZipUp.Enabled = <span style=\"color:blue\">True</span>\r\n        <span style=\"color:blue\">Me</span>.btnZipUp.Text = <span style=\"color:#a31515\">&quot;Zip it!&quot;</span>\r\n        <span style=\"color:blue\">Me</span>.ProgressBar2.Value = 0\r\n        <span style=\"color:blue\">Me</span>.Cursor = Cursors.<span style=\"color:blue\">Default</span>\r\n        <span style=\"color:blue\">If</span> <span style=\"color:blue\">Not</span> <span style=\"color:blue\">Me</span>._workerThread.IsAlive <span style=\"color:blue\">Then</span>\r\n            <span style=\"color:blue\">Me</span>._workerThread.<span style=\"color:blue\">Join</span>()\r\n        <span style=\"color:blue\">End</span> <span style=\"color:blue\">If</span>\r\n    <span style=\"color:blue\">End</span> <span style=\"color:blue\">Sub</span>\r\n\r\n    <span style=\"color:blue\">Private</span> <span style=\"color:blue\">Sub</span> SetProgressBars()\r\n        <span style=\"color:blue\">If</span> <span style=\"color:blue\">Me</span>.ProgressBar2.InvokeRequired <span style=\"color:blue\">Then</span>\r\n            <span style=\"color:blue\">Me</span>.ProgressBar2.Invoke(<span style=\"color:blue\">New</span> MethodInvoker(<span style=\"color:blue\">AddressOf</span> SetProgressBars))\r\n        <span style=\"color:blue\">Else</span>\r\n            <span style=\"color:blue\">Me</span>.ProgressBar2.Value = 0\r\n            <span style=\"color:blue\">Me</span>.ProgressBar2.Minimum = 0\r\n            <span style=\"color:blue\">Me</span>.ProgressBar2.Maximum = 1\r\n            <span style=\"color:blue\">Me</span>.ProgressBar2.<span style=\"color:blue\">Step</span> = 2\r\n        <span style=\"color:blue\">End</span> <span style=\"color:blue\">If</span>\r\n    <span style=\"color:blue\">End</span> <span style=\"color:blue\">Sub</span>\r\n\r\n<span style=\"color:blue\">End</span> <span style=\"color:blue\">Class</span>\r\n\r\n<span style=\"color:blue\">Public</span> <span style=\"color:blue\">Class</span> WorkerOptions\r\n    <span style=\"color:green\">' Fields</span>\r\n    <span style=\"color:green\">'Public Comment As String</span>\r\n    <span style=\"color:green\">'Public CompressionLevel As CompressionLevel</span>\r\n    <span style=\"color:green\">'Public Encoding As String</span>\r\n    <span style=\"color:green\">'Public Encryption As EncryptionAlgorithm</span>\r\n    <span style=\"color:green\">'Public Folder As String</span>\r\n    <span style=\"color:blue\">Public</span> File <span style=\"color:blue\">As</span> <span style=\"color:blue\">String</span>\r\n    <span style=\"color:green\">'Public Password As String</span>\r\n    <span style=\"color:green\">'Public Zip64 As Zip64Option</span>\r\n    <span style=\"color:green\">'Public ZipFlavor As Integer</span>\r\n    <span style=\"color:blue\">Public</span> ZipName <span style=\"color:blue\">As</span> <span style=\"color:blue\">String</span>\r\n<span style=\"color:blue\">End</span> <span style=\"color:blue\">Class</span>\r\n\r\n\r\n\r\n</pre>\r\n</div>\r\n<p>Any advice would be great.</p>\r\n<p>&nbsp;</p>",
    "PostedDate": "2010-05-15T13:10:22.847-07:00",
    "UserRole": null,
    "MarkedAsAnswerDate": null
  },
  {
    "Id": "443449",
    "ThreadId": "212765",
    "Html": "<p>I understand what you're saying.</p>\r\n<p>You haven't provided a stacktrace, and I don't see an obvious place where the exception would occur.<br>So I can't provide any immediate assistance.</p>\r\n<p>Do you understand the cross-threading issue?&nbsp; if not, you might want to read this:<br><a href=\"http://msdn.microsoft.com/en-us/library/ms171728(VS.90).aspx\">http://msdn.microsoft.com/en-us/library/ms171728(VS.90).aspx</a></p>\r\n<p>&nbsp;</p>",
    "PostedDate": "2010-05-16T08:24:50.99-07:00",
    "UserRole": null,
    "MarkedAsAnswerDate": null
  },
  {
    "Id": "443450",
    "ThreadId": "212765",
    "Html": "<p>Also, if you are zipping a single file, and if the file is not very large (let's say, under 10mb), you should be able to do the zipping on the UI thread,<br>with minimal UI freezing effects. The zip may take 1 second, which is a tolerable delay in a winforms app.&nbsp; <br>You need additional threads and the handling for them, only if the zip save will take a long time.&nbsp;</p>",
    "PostedDate": "2010-05-16T08:29:03.27-07:00",
    "UserRole": null,
    "MarkedAsAnswerDate": null
  }
]