private void CheckNext(PackageResourceLoaderElement currentDoneElement)
        {
            if (!currentDoneElement.HavError())
            {
                // update process
                m_fCurrentProcess = (float)m_TaskSucceedQueue.Count / (float)m_iTotalLoadCount;
                if (null != m_ProcessCallback)
                {
                    m_ProcessCallback(m_fCurrentProcess, currentDoneElement.GetName());
                }
            }

            // check is all done
            if (m_iTotalLoadCount == (m_TaskSucceedQueue.Count + m_TaskErrorQueue.Count))
            {
                // all done check
                CheckComplate();
            }
            else
            {
                // start task
                StartTask();
            }
        }
        private IEnumerator BeginLoad(PackageResourceLoaderElement taskElem)
        {
            Debug.Log(taskElem.GetUrl());
            PackageResourceWWWElement loader = new PackageResourceWWWElement(taskElem.GetUrl());

            yield return(loader);

            // update loader count
            --m_iCurrentLoaderCount;

            if (m_bIsCrash)
            {
                loader.GetRequest().Dispose();

                if (m_iCurrentLoaderCount == 0)
                {
                    m_bIsRunning = false;
                }
            }
            else
            {
                OnOneTaskDone(taskElem, loader);
            }
        }
        private void OnOneTaskDone(PackageResourceLoaderElement taskElem, PackageResourceWWWElement request)
        {
            do
            {
                if (request.GetError() != null)
                {
                    taskElem.SetErrorInfo(request.GetError());
                    // release www
                    request.GetRequest().Dispose();

                    // add to error list
                    m_TaskErrorQueue.Enqueue(taskElem);
                    break;
                }
                // check www content
                if (null == request.GetRequest().bytes)
                {
                    taskElem.SetErrorInfo("load error");

                    // release www
                    request.GetRequest().Dispose();

                    // add to error list
                    m_TaskErrorQueue.Enqueue(taskElem);
                    break;
                }
                try
                {
                    byte[] content = request.GetRequest().bytes;
                    if (null != m_Decompressor)
                    {
                        // decompress
                        content = m_Decompressor.Decompress(content);
                    }
                    // ensure folder
                    PackageResourceTool.EnsureFolder(taskElem.GetOutputPath());

                    // try write byte files
                    System.IO.File.WriteAllBytes(taskElem.GetOutputPath(), content);

                    // add to succeed list
                    m_TaskSucceedQueue.Enqueue(taskElem);
                }
                catch (Exception e)
                {
                    // mark error msg
                    taskElem.SetErrorInfo(e.Message);

                    // release www
                    request.GetRequest().Dispose();

                    // add to error list
                    m_TaskErrorQueue.Enqueue(taskElem);

                    // check is need crash
                    m_bIsCrash = true;
                    CallbackWithError();
                    return;
                }
            }while (false);

            // check next
            CheckNext(taskElem);
        }