Search code examples
c#ftpuwpbuffersendfile

System.ObjectDisposedException UWP


i've an issue in my application. I'm trying to send an image into FTP server. I'm able to connect with server, authenticate, and other. But when i try to send file, if the file is big (usually bigger than 40-50kb) i got System.ObjectDisposedException.

This is the code that i use to send:

public async Task <byte[]> GetResultingBuffer(IRandomAccessStreamWithContentType readStream, IBuffer buffer)
        {
            var resultingBuffer = new byte[0];
            while (true)
            {
                IBuffer readBuffer = await readStream.ReadAsync(buffer, 1024, InputStreamOptions.Partial);

                if (readBuffer.Length == 0) break;

                resultingBuffer = resultingBuffer.Concat(readBuffer.ToArray()).ToArray();
            }
            return resultingBuffer;
        }

        public async Task UploadFileAsync(StorageFile file, string destination)
        {
            using (var stream = await OpenWriteAsync(destination))
            {
                //
                // A more efficient way, maybe a DataReader can be used here
                using (var readStream = await file.OpenReadAsync())
                {
                    var buffer = new byte[1024].AsBuffer();
                    var resultingBuffer = new byte[0];
                    resultingBuffer = await GetResultingBuffer(readStream, buffer);


                    await stream.WriteAsync(resultingBuffer.AsBuffer());
                    await stream.FlushAsync();
                }
            }
        }

I tried to edit it, before editing GetResultingBuffer was not a task, but a cycle inside UploadFileAsnc. How can i prevent to dispose the buffer? Is there another solution? Thanks!


Solution

  • I solved it in this way

    using (var readStream = await file.OpenReadAsync())
                    {
                        var buffer = new byte[3000000].AsBuffer();
                        //var resultingBuffer = new byte[10000000];
                        Debug.Write("-------");
                        //while (true)
                        //{
                            IBuffer readBuffer = await readStream.ReadAsync(buffer, 3000000, InputStreamOptions.Partial);
    
                        //if (readBuffer.Length == 0) break;
    
                        //resultingBuffer = resultingBuffer.Concat(readBuffer.ToArray()).ToArray();
                        //}
    
                        // await stream.WriteAsync(resultingBuffer.AsBuffer());
                        var  resultingBuffer = new byte[readBuffer.Length];
                        readBuffer.CopyTo(resultingBuffer);
    
                        await stream.WriteAsync(resultingBuffer.AsBuffer());
                    }
    
                    Debug.Write("-------");
                    await stream.FlushAsync();