/// <summary>
        /// Requests an image from SecondLife and blocks until it's received.
        /// </summary>
        /// <param name="ImageID">The Image's AssetID</param>
        public byte[] RequestImage(LLUUID ImageID)
        {
            byte[] imgData = CachedImage(ImageID);
            if (imgData != null)
            {
                return(imgData);
            }

            TransferRequest tr;

            lock (htDownloadRequests)
            {
                if (htDownloadRequests.ContainsKey(ImageID) == false)
                {
                    tr                  = new TransferRequest();
                    tr.Size             = int.MaxValue;          // Number of bytes expected
                    tr.Received         = 0;                     // Number of bytes received
                    tr.TimeOfLastPacket = Helpers.GetUnixTime(); // last time we recevied a packet for this request

                    htDownloadRequests[ImageID] = tr;

                    Packet packet = ImagePacketHelper.RequestImage(ImageID);
                    slClient.Network.SendPacket(packet);
                }
                else
                {
                    tr = htDownloadRequests[ImageID];
                }
            }

            // Wait for transfer to complete.
            while (!tr.Completed.WaitOne(10000, false))  //If it times out, then check, otherwise loop again until WaitOne returns true
            {
                slClient.Log("Warning long running texture download: " + ImageID.ToStringHyphenated(), Helpers.LogLevel.Warning);
                Console.WriteLine("Downloaded : " + tr.Received);
                if ((Helpers.GetUnixTime() - tr.TimeOfLastPacket) > 10)
                {
                    tr.Status    = false;
                    tr.StatusMsg = "Timeout while downloading image.";
                    slClient.Log(tr.StatusMsg, Helpers.LogLevel.Error);
                    tr.Completed.Set();
                }
            }

            if (tr.Status == true)
            {
                return(tr.AssetData);
            }
            else
            {
                throw new Exception("RequestImage: " + tr.StatusMsg);
            }
        }
        /// <summary>
        /// Requests an image from SecondLife and blocks until it's received.
        /// </summary>
        /// <param name="ImageID">The Image's AssetID</param>
        public byte[] RequestImage(LLUUID ImageID)
        {
            byte[] imgData = CachedImage(ImageID);
            if (imgData != null)
            {
                return(imgData);
            }

            TransferRequest tr;

            lock (htDownloadRequests)
            {
                if (htDownloadRequests.ContainsKey(ImageID) == false)
                {
                    tr            = new TransferRequest();
                    tr.Size       = int.MaxValue;          // Number of bytes expected
                    tr.Received   = 0;                     // Number of bytes received
                    tr.LastPacket = Helpers.GetUnixTime(); // last time we recevied a packet for this request

                    htDownloadRequests[ImageID] = tr;

                    Packet packet = ImagePacketHelper.RequestImage(ImageID);
                    slClient.Network.SendPacket(packet);
                }
                else
                {
                    tr = htDownloadRequests[ImageID];
                }
            }

            // Wait for transfer to complete.
            tr.Completed.WaitOne();

            if (tr.Status == true)
            {
                return(tr.AssetData);
            }
            else
            {
                throw new Exception("RequestImage: " + tr.StatusMsg);
            }
        }