Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MemoryMappedFile的并发视图引发UnauthorizedAccessException_C#_.net_C# 4.0 - Fatal编程技术网

C# MemoryMappedFile的并发视图引发UnauthorizedAccessException

C# MemoryMappedFile的并发视图引发UnauthorizedAccessException,c#,.net,c#-4.0,C#,.net,C# 4.0,我有一个大的文本文件(0.5 gig),我需要在不同的情况下一遍又一遍地解析它,在一个方法中多达40次。当然,这将需要很长时间,我试图通过同时执行来更快地处理文件。我知道MemoryMappedFile非常适合处理大文件和并发性,所以我选择使用它 现在,我同时创建了文件的两个视图(视图由两个不同的部分组成),但是当一个视图工作得很好时,另一个视图抛出了一个UnauthorizedAccessException。以下是犯罪代码: private void PartitionAndAnalyzeTe

我有一个大的文本文件(0.5 gig),我需要在不同的情况下一遍又一遍地解析它,在一个方法中多达40次。当然,这将需要很长时间,我试图通过同时执行来更快地处理文件。我知道
MemoryMappedFile
非常适合处理大文件和并发性,所以我选择使用它

现在,我同时创建了文件的两个视图(视图由两个不同的部分组成),但是当一个视图工作得很好时,另一个视图抛出了一个
UnauthorizedAccessException
。以下是犯罪代码:

private void PartitionAndAnalyzeTextBlock(int start, int length)
{
    Console.WriteLine("Starting analysis");

    //Exception thrown here 
    using (var accessor = file.CreateViewAccessor(start, length, MemoryMappedFileAccess.Read)) 
    {
        char[] buffer = new char[BufferSize];

        for (long i = 0; i < length; i += 5)
        {
            accessor.ReadArray(i, buffer, 0, 5);

            string retString = new string(buffer);
            frequencyCounter.AddOrUpdate(retString, 1, (s, j) => j++);
        }
    }

    Console.WriteLine("Finished analysis");
}

你知道这是什么原因吗?

这可能与你如何创建内存映射文件有关。请检查约翰·斯基特对此的回答。MemoryMappedFileAccess.Read访问权传递给CreateFromFile方法


编辑:如注释所示,CreateViewAccessor方法将偏移量和大小作为参数,以确定视图将访问文件的哪个部分。如果这些值超出文件的实际大小,将引发UnauthorizedAccessException。

我尝试使用允许
MemoryMappedFileAccess
的构造函数,并使用以下代码:private MemoryMappedFile=MemoryMappedFile.CreateFromFile(新文件流(路径,FileMode.Open,FileAccess.Read,FileShare.Read),“MemoryMappedPi”,500000000,MemoryMappedFileAccess.Read,null,HandleInheritability.Inheritable,false);这没有帮助。这也不能解释为什么这在一个线程上有效,但在另一个线程上无效。我曾尝试从两个不同线程中的同一个MemoryMappedFile创建两个MemoryMapViewAccessor,但没有得到任何异常。您是否尝试在两个线程中传递PartitionAndAnalyzeTextBlock方法中的相同值作为测试。如果您在CreateViewAccessor中传递的参数值与文件大小不符,则会出现UnauthorizedAccessException。我很惊讶我没有想到这一点。这就是问题所在,将参数传递到文件之外……只需将其放在您的答案中,而不是放在注释中,我很乐意接受它。我用真实值更新了答案解决方案。很高兴我能提供帮助。这个异常没有任何意义。假设它是由环境因素触发的,比如恶意软件扫描程序。你不可能在32位进程中分配两个0.5 GB视图,所以从要求更少开始。由环境触发的异常?我不知道这是可能的。另外,有四个视图同时运行,总容量为0.5GB。每个视图都是0.5GB文件的四分之一。
private MemoryMappedFile file = MemoryMappedFile.CreateFromFile(path, FileMode.Open, "MemoryMappedPi");