{
  "WorkItem": {
    "AffectedComponent": {
      "Name": "",
      "DisplayName": ""
    },
    "ClosedComment": "This capability is now available, via the ZipInputStream and ZipOutputStream classes.  ",
    "ClosedDate": "2009-10-21T16:51:48.95-07:00",
    "CommentCount": 0,
    "Custom": null,
    "Description": "Being that this library deals with I/O, I recommend adding support for asynchronous operations. Use the Asynchronous Programming Model (APM), which is standard throughout the .NET Framework. \n \nAsync operations are already available on GZipStream, DeflateStream, and ZlibStream in the Ionic.Zlib namespace.   \nBut we need Async versions of Save and ExtractAll for the ZipFile class.  And possibly Read. \n \nFor any library used in any environment that needs to scale, blocking on I/O is unacceptable.",
    "LastUpdatedDate": "2015-01-10T18:42:34.477-08:00",
    "PlannedForRelease": "",
    "ReleaseVisibleToPublic": false,
    "Priority": {
      "Name": "Medium",
      "Severity": 100,
      "Id": 2
    },
    "ProjectName": "DotNetZip",
    "ReportedDate": "2008-11-25T15:26:28.36-08:00",
    "Status": {
      "Name": "Closed",
      "Id": 4
    },
    "ReasonClosed": {
      "Name": "Unassigned"
    },
    "Summary": "Support Asynchronous Operations",
    "Type": {
      "Name": "Feature",
      "Id": 1
    },
    "VoteCount": 13,
    "Id": 6661
  },
  "FileAttachments": [],
  "Comments": [
    {
      "Message": "This would be very nice.  It's easy enough to work around, but a built-in approach would be easier to use and probably more efficient.",
      "PostedDate": "2009-05-25T13:20:22.97-07:00",
      "Id": -2147483648
    },
    {
      "Message": "",
      "PostedDate": "2009-05-27T06:02:39.087-07:00",
      "Id": -2147483648
    },
    {
      "Message": "",
      "PostedDate": "2009-06-16T08:12:08.953-07:00",
      "Id": -2147483648
    },
    {
      "Message": "",
      "PostedDate": "2009-06-16T08:17:33.593-07:00",
      "Id": -2147483648
    },
    {
      "Message": "",
      "PostedDate": "2009-08-16T19:37:58.467-07:00",
      "Id": -2147483648
    },
    {
      "Message": "",
      "PostedDate": "2009-09-03T12:14:27.543-07:00",
      "Id": -2147483648
    },
    {
      "Message": "",
      "PostedDate": "2009-09-03T14:32:55.53-07:00",
      "Id": -2147483648
    },
    {
      "Message": "",
      "PostedDate": "2009-09-03T14:42:20.127-07:00",
      "Id": -2147483648
    },
    {
      "Message": "I know a bunch of people up-voted  this and I'd like to know what exactly people expect.  The two longest-running methods on the ZipFile class are Save and ExtractAll(), in the various overloads.   I could provide async versions of these but wouldn't it be simpler for the caller to just do it themselves, using a BeginInvvoke on an Action delegate?  \r\n\r\nAction a = zip.Save;\r\na.BeginInvoke(MyAsynchSaveCompleted, null); \r\n\r\nand then\r\n\r\nprivate void MyAsynchSaveCompleted(IAsyncResult ar)\r\n{\r\n Action a = (ar as System.Runtime.Remoting.Messaging.AsyncResult).AsyncDelegate as Action;\r\n try\r\n {\r\n   a.EndInvoke(ar);\r\n }\r\n catch(Exception e)\r\n {\r\n    // ...\r\n }\r\n}\r\n\r\nor even with QueueUserWorkItem() if tracking exceptions isn't important. \r\n\r\n\r\nThere is a school of design that recommends that classes DO NOT provide async interfaces, because it is better to maintain a separation of concerns. \r\n\r\nI'm interested in feedback.\r\n",
      "PostedDate": "2009-09-03T16:15:47.407-07:00",
      "Id": -2147483648
    },
    {
      "Message": "Heres my opinion\r\nI would prefer the async operations to be provided in the library - there are plenty of sync and async overloaded methods within the .Net framework.\r\n\r\nIt does appear to look very simple to do manually - but providing the methods means people get a very easy discoverable way of of how to do it and hopefully some excellent  examples.\r\n\r\nSome people may see that people should discover how to do it manually and therefore improve their skills. That is a strong argument. But I like things to be easy if the library provides support I will probably try to use it first.\r\n\r\nI believe it will be a nice feature add of your library.",
      "PostedDate": "2009-09-30T06:44:42.033-07:00",
      "Id": -2147483648
    },
    {
      "Message": "",
      "PostedDate": "2009-10-21T16:51:48.95-07:00",
      "Id": -2147483648
    },
    {
      "Message": "",
      "PostedDate": "2013-02-21T18:44:35.077-08:00",
      "Id": -2147483648
    },
    {
      "Message": "",
      "PostedDate": "2013-05-16T05:32:34.38-07:00",
      "Id": -2147483648
    },
    {
      "Message": "I'm sorry, but I dont understand how ZipOutputStream and ZipInputStream solve ExtractAll not being asynchronous. I might be missing an example here.\r\n\r\nWith .NET 4.5, can we hope this feature for ExtractAll and Save ?",
      "PostedDate": "2014-10-03T07:50:39.423-07:00",
      "Id": -2147483648
    },
    {
      "Message": "I would look at System.Net.WebClient as inspiration for design.\r\n\r\n.SaveAsync()\n.ExtractAllAsync()\n.IsBusy()\r\n\r\nAnd an event for completion (in addition to the progress one you have now).\nI didn't realize it was that easy to use Action to implement it so maybe you just use that to build these methods in?",
      "PostedDate": "2015-01-10T17:45:30.633-08:00",
      "Id": -2147483648
    },
    {
      "Message": "Also, I don't know how WebClient.DownloadProgressChanged is implemented but it does not occur on a separate thread - maybe it invoke's it back.",
      "PostedDate": "2015-01-10T18:42:34.477-08:00",
      "Id": -2147483648
    }
  ]
}