【问题标题】:Accessing the same files from multiple tasks从多个任务访问相同的文件
【发布时间】:2016-05-31 04:23:59
【问题描述】:

我在磁盘上有很多文件需要读取和反序列化,如果我尝试使用流读取器从多个任务中访问这些文件,我会收到以下异常:

System.ObjectDisposedException: Cannot access a disposed object
System.Runtime.InteropServices.SafeHandle.DangerousReleaseInternal(bool dispose)SafeHandle.cs:193
System.Runtime.InteropServices.SafeHandle.DangerousRelease()SafeHandle.cs:142
System.IO.FileStream.Dispose(bool disposing)FileStream.cs:913
System.IO.IsolatedStorage.IsolatedStorageFileStream.Dispose(bool disposing)IsolatedStorageFileStream.cs:250
System.IO.Stream.Close()stream.cs:248
 System.IO.StreamReader.Dispose(bool disposing)streamreader.cs:296
System.IO.TextReader.Dispose()textreader.cs:78
System.IO.TextReader.Dispose()(wrapper remoting-invoke-with-check)
.FileServices.StreamReaderWrapper.Dispose()
.FileServices.IsolatedSerializer.<DeserializeAsync>d__9<T>.MoveNext()

代码如下:

public async Task<T> DeserializeAsync<T>(string path)
{
    T result = default(T);
    if (!_fileRepository.FileManager.FileExists(path)) { return result; }

    using (var streamReader = _streamReader.GetNew(_fileRepository.FileManager.OpenFile(
            path, FileMode.Open, FileAccess.Read, FileShare.Read)))
    {
        var contents = await streamReader.ReadToEndAsync();
        result = _jsonSerializer.DeserializeFromString<T>(contents, Encoding.UTF8);
        streamReader.Dispose();
    }
    return result;
}

我在这里做错了什么?

    /// <summary>
/// Wrapper to allow testing with StreamReader
/// </summary>
public class StreamReaderWrapper : IStreamReader
{
    private StreamReader _streamReader;

    public void Dispose()
    {
        if (_streamReader != null)
        {
            _streamReader.Dispose();
            _streamReader = null;
        }
    }

    public IStreamReader GetNew(Stream stream)
    {
        Dispose();
        _streamReader = new StreamReader(stream);
        return this;
    }

    public string ReadToEnd()
    {
       return _streamReader.ReadToEnd();
    }

    public Task<string> ReadToEndAsync()
    {
        return _streamReader.ReadToEndAsync();
    }
}

【问题讨论】:

  • 您能粘贴 GetNew 方法中的代码吗?

标签: c# file-io async-await task streamreader


【解决方案1】:

您呼叫Dispose 两次。 using 语句将在退出代码块后自动处理您的streamReader 变量。但是你也明确地调用了streamReader.Dispose();

另外,你的StreamReaderWrapper.GetNew() 应该只返回一个新的包装器实例,否则线程会互相踩到对方的脚趾

【讨论】:

    【解决方案2】:

    我认为您无法访问“getNew”功能,因为您已经处置了该对象..

    来自您的代码:

    使用 (var streamReader = _streamReader.GetNew(_fileRepository.FileManager.OpenFile(

    谁是“_streamReader”?包装器的实例还是被包装的阅读器?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 2022-06-24
      • 2013-08-22
      相关资源
      最近更新 更多