javisrk
javisrk

Reputation: 582

Silverlight becomes unresponsive when downloading a file

I'm trying to use the following snippet in order download files via the SaveFileDialog in Silverlight:

    public void SaveMediaLocal(string fileName)
    {
        FileInfo fInfo = new FileInfo(fileName);
        if (fInfo.Exists)
        {
            if (fInfo.Length > 0)
            {
                string extension = fInfo.Extension;
                SaveFileDialog dialog = new SaveFileDialog()
                {
                    DefaultExt = extension,
                    Filter = String.Format("{1} files (*.{0})|*.{0}|All files (*.*)|*.*", extension, fInfo.Extension),
                    FilterIndex = 1,
                    DefaultFileName = fInfo.Name
                };
                if (dialog.ShowDialog() == true)
                {                       
                    try
                    {
                        bool cancelFlag = false;
                        byte[] buffer = new byte[1024 * 1024]; // 1GB buffer
                        using (FileStream dest = (FileStream)dialog.OpenFile())
                        {
                            using (FileStream source = new FileStream(fInfo.FullName, FileMode.Open, FileAccess.Read))
                            {
                                long fileLength = source.Length;
                                long totalBytes = 0;
                                int currentBlockSize = 0;

                                while ((currentBlockSize = source.Read(buffer, 0, buffer.Length)) > 0)
                                {
                                    totalBytes += currentBlockSize;
                                    double percentage = (double)totalBytes * 100.0 / fileLength;

                                    dest.Write(buffer, 0, currentBlockSize);
                                }
                            }
                        }
                    }
                    catch
                    {

                    }                        
                }
            }
            else
            {
                //no results
            }
        }
    }

When I use this snippet; Silverlight freezes until the download completes. When I use this snippet instead, the UI is responsive, but doesn't work on bigger files.

                        using (Stream stream = dialog.OpenFile())
                    {

                        Byte[] bytes = File.ReadAllBytes(fileName);
                        stream.Write(bytes, 0, bytes.Length);
                    }

Is there something that I'm missing here?

Upvotes: 0

Views: 28

Answers (1)

ΩmegaMan
ΩmegaMan

Reputation: 31721

Don't do the operation on the GUI thread. That is why it gets unresponsive. Either create a new thread or async process and do the operation in the background.

Upvotes: 1

Related Questions