【问题标题】:System.ObjectDisposedException UWPSystem.ObjectDisposedException UWP
【发布时间】:2017-03-08 17:20:26
【问题描述】:

我的申请有问题。我正在尝试将图像发送到 FTP 服务器。我能够连接服务器、进行身份验证和其他。但是当我尝试发送文件时,如果文件很大(通常大于 40-50kb)我得到 System.ObjectDisposedException。

这是我用来发送的代码:

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();
                }
            }
        }

我尝试编辑它,在编辑 GetResultingBuffer 之前不是一个任务,而是 UploadFileAsnc 中的一个循环。我怎样才能防止处理缓冲区?还有其他解决方案吗?谢谢!

【问题讨论】:

  • 你是在哪一行代码中得到错误的?
  • 在 While (true) 的循环中。认为是内存异常错误。我在下面的答案中解决了它

标签: c# ftp uwp buffer sendfile


【解决方案1】:

我是这样解决的

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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多