从多个任务访问相同的文件

Accessing the same files from multiple tasks

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

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" 函数,因为您已经释放了对象..

来自您的代码:

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

谁是“_streamReader”?包装器或包装器的实例 reader?

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

此外,您的 StreamReaderWrapper.GetNew() 应该只是 return 包装器的一个新实例,否则线程会互相踩脚