FileStream.(Begin/End)(Read/Write)的同步要求

2024-05-01

.Net 可以接受以下多线程调用模式吗文件流 http://msdn.microsoft.com/en-us/library/y0bs3w9t%28v=VS.90%29.aspx?

多个线程调用这样的方法:

ulong offset = whatever; // different for each thread
byte[] buffer = new byte[8192];
object state = someState; // unique for each call, hence also for each thread

lock(theFile)
{
    theFile.Seek(whatever, SeekOrigin.Begin);
    IAsyncResult result = theFile.BeginRead(buffer, 0, 8192, AcceptResults, state);
}

if(result.CompletedSynchronously)
{
    // is it required for us to call AcceptResults ourselves in this case?
    // or did BeginRead already call it for us, on this thread or another?
}

Where AcceptResults is:

void AcceptResults(IAsyncResult result)
{
    lock(theFile)
    {
         int bytesRead = theFile.EndRead(result);

         // if we guarantee that the offset of the original call was at least 8192 bytes from
         // the end of the file, and thus all 8192 bytes exist, can the FileStream read still
         // actually read fewer bytes than that?

         // either:
         if(bytesRead != 8192)
         {
             Panic("Page read borked");
         }

         // or:
         // issue a new call to begin read, moving the offsets into the FileStream and
         // the buffer, and decreasing the requested size of the read to whatever remains of the buffer
    }
}

我很困惑,因为文档对我来说似乎不清楚。例如,FileStream 类表示:

此类型的任何公共静态成员都是线程安全的。不保证任何实例成员都是线程安全的。

但 BeginRead 的文档似乎考虑了多个读取请求:

多个同时异步请求导致请求完成顺序不确定。

飞行中是否允许多次读取?写?这是确保位置安全的适当方法吗?Position调用 Seek 和调用之间的流BeginRead?或者是否需要一直持有该锁EndRead,因此一次只有一个在飞行中读取或写入?

我知道回调将发生在不同的线程上,并且我的处理state, buffer以允许多次飞行读取的方式处理该问题。

此外,有谁知道在文档中哪里可以找到这些问题的答案?或者有知情人士写的文章?我一直在寻找,但找不到任何东西。

相关文档:

文件流类 http://msdn.microsoft.com/en-us/library/y0bs3w9t%28v=VS.90%29.aspx
求方法 http://msdn.microsoft.com/en-us/library/883dhyx0.aspx
开始读取方法 http://msdn.microsoft.com/en-us/library/zxt5ahzw.aspx
EndRead http://msdn.microsoft.com/en-us/library/525xt96h.aspx
IAsyncResult 接口 http://msdn.microsoft.com/en-us/library/system.iasyncresult_members%28v=VS.90%29.aspx

编辑一些新信息

使用 Reflector 进行快速检查表明 BeginRead 确实将流位置捕获到每次调用状态(NativeOverlapped 结构的某些字段)。看起来 EndRead 不会查询流位置,至少不会以任何明显的方式。显然,这并不是决定性的,因为它可能是以一种不明显的方式,或者底层的本机 API 可能不支持。


是的,文档很粗略。不幸的是,没有更好的文档的线索。

编辑:实际上 Joe Duffy 的书《Windows 上的并发编程》有第 8 章 APM,其中解释了异步 API、IAsyncResult 等(好书和作者)。这里的基本问题仍然是 MSDN 说实例变量不是线程安全的,因此需要适当的同步。

那么您有多个线程在 theFile 的同一个实例上启动 BeginRead 吗?不过,BeginRead 页面确实提到了这一点:“每次调用 BeginRead 时,必须调用一次 EndRead。如果在开始另一次读取之前未能结束读取过程,可能会导致死锁等不良行为。”此外,您正在对 File 对象调用 Seek,而其他线程可能正在执行其 BeginRead 回调。一点也不安全。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FileStream.(Begin/End)(Read/Write)的同步要求 的相关文章

  • XPATH 查询、HtmlAgilityPack 和提取文本

    我一直在尝试从名为 tim new 的类中提取链接 我也得到了解决方案 给出了解决方案 片段和必要的信息here https stackoverflow com questions 2982862 extracting a table ro
  • 叮当错误?命名空间模板类的朋友

    以下代码在 clang 下无法编译 但在 gcc 和 VS 下可以编译 template
  • 将 OpenCV Mat 转换为数组(可能是 NSArray)

    我的 C C 技能很生疏 OpenCV 的文档也相当晦涩难懂 有没有办法获得cv Mat data属性转换为数组 NSArray 我想将其序列化为 JSON 我知道我可以使用 FileStorage 实用程序转换为 YAML XML 但这不
  • 司机和提供商之间的区别

    数据库中的驱动程序和提供程序有什么区别 有没有解释一下 不胜感激 样本 ADO NET driver for MySQL vs providerName System Data EntityClient 来自 MSDN 论坛 驱动程序是安装
  • 将设置函数(setter)标记为 constexpr 的目的是什么? [复制]

    这个问题在这里已经有答案了 我无法理解将 setter 函数标记为的目的constexpr 自 C 14 起这是允许的 我的误解来自以下情况 我使用 constexpr c tor 声明一个类 并且我将通过创建该类的 constexpr 实
  • .NET 程序集差异/比较工具 - 有什么可用? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我希望能够在两个程序集之间进行代码级差异 Reflector 的 Diff 插件是迄今为止我发现的最接
  • while循环中的变量初始化

    我有一个可以分块读取文件的函数 public static DataObject ReadNextFile 数据对象看起来像这样 public DataObject public string Category get set And ot
  • 为什么需要数字后缀?

    C 语言 我确信还有其他语言 需要在数字文字末尾添加后缀 这些后缀指示文字的类型 例如 5m是一个小数 5f是一个浮点数 我的问题是 这些后缀真的有必要吗 或者是否可以从上下文中推断出文字的类型 例如 代码decimal d 5 0应该推断
  • 有什么方法可以重载 C# 中的扩展方法吗?

    我有以下模型模式 public abstract class PARENTCLASS public class CHILD A CLASS PARENTCLASS public static class EXTENSION public s
  • 如何使用 Roslyn 通过扩展方法、静态类中的方法以及带有 ref/out 参数的方法来访问调用

    我正在致力于创建一个开源项目 用于创建 NET UML 序列图 该项目利用名为 js sequence diagrams 的 javascript 库 我不确定 Roslyn 是适合这项工作的工具 但我想我应该尝试一下 所以我整理了一些概念
  • 通过 C# Mailkit / Mimekit 发送电子邮件,但出现服务器证书错误

    Visual Studio 2015 中的 0 代码 1 我正在使用 Mailkit 最新版本 1 18 1 1 从我自己的电子邮件服务器发送电子邮件 2 电子邮件服务器具有不受信任的自签名证书 3 我在代码中添加了以下两行 以忽略服务器证
  • 用于连接 DataTable 上的动态列的动态 LINQ

    我目前遇到的情况不确定如何继续 我有两个从数据库填充的数据表 我还有一个可用的列名称列表 可用于将这两个数据表连接在一起 我希望编写一组 LINQ 查询 这些查询将 显示两个数据表中的行 内部联接 用于从一个数据表更新另一个数据表 显示一个
  • 如何使用递归查找数字中的最小元素 [C]

    好的 所以我正在准备我的 C 考试 当谈到递归时我有点卡住了我是大学一年级的学生 这对我来说似乎有点困难 练习要求在给定的数字中使用递归函数我需要找到最小的元素 例如 52873 是 2 程序需要打印 2 include
  • 时间:2019-03-17 标签:c++fstream并发访问

    如果从不同的进程 线程同时访问文件会发生什么 据我所知 没有锁定文件的标准方法 只有操作系统特定的功能 就我而言 文件将被经常读取而很少写入 现在如果A打开一个文件进行读取 ifstream 并开始读取块 和B打开相同的文件进行写入 ofs
  • doxygen c++:记录由“using”声明公开的私有继承成员

    作为一个例子 我有以下课程 class A public void methodOne class B private A public Brief description using A methodOne 我还没有找到强制 doxyge
  • 使用 xslt 将 xml 转换为 xsl-fo 时动态创建超链接?

    我想使用 xsl 文件在 PDF 报告中创建标题 如果源文件包含超链接 则应将其呈现为超链接 否则呈现为纯文本 例如 我的 xml 如下所示 a href http google com target blank This is the h
  • rabbitmq 的 REST API

    有没有办法从 ajax 向 RabbitMQ 发送数据 我的应用程序由数千个 Web 客户端 用 js 编写 和 WCF REST 服务组成 现在我试图弄清楚如何为我的应用程序创建可扩展点 这个想法是有一个rabbitmq实例 它从放置在一
  • 这种尺寸对齐是如何工作的

    对于所提供的评论 我无法理解以下代码 这段代码的作用是什么 以及等效的代码是什么8 aligned segment size must be 4 aligned attr gt options ssize 3 Here ssize is o
  • 将 char 绑定到枚举类型

    我有一段与此非常相似的代码 class someclass public enum Section START MID END vector section Full void ex for int i 0 i section
  • 如何提高环复杂度?

    对于具有大量决策语句 包括 if while for 语句 的方法 循环复杂度会很高 那么我们该如何改进呢 我正在处理一个大项目 我应该减少 CC gt 10 的方法的 CC 并且有很多方法都存在这个问题 下面我将列出一些例如我遇到的问题的

随机推荐

  • 无法运行正在访问 GlassFish v3 上的 EJB 的应用程序客户端

    环境 GlassFish 3 0 1 NetBeans 6 9 JDK 6u21 Problem 无法运行正在访问 EJB 的应用程序客户端 错误报告可以在下面找到http netbeans org bugzilla show bug cg
  • 创建表之间的关系

    我的问题特别是关于 sql server 但任何具有任何数据库背景的人都可以回答 如果我希望表 A 与表 B 在某个列上具有 1 1 关系 我是否应该以某种方式修改 CREATE TABLE 语句来标识这种关系 或者这是根本没有完成的事情
  • 为什么 Clang 更喜欢主模板而不是 C++17 的专业化?

    下列program https godbolt org z f43EK4PnY从此代码中减少question https stackoverflow com questions 66740188 template
  • 获取因子变量中水平和标签之间的原始关联

    我正在寻找一个函数来获取因子变量的原始映射表 我导入一个 Rdata 文件 我有一个名为 FactVar 的因子变量 我知道 FactVar 的映射表如下 010025 gt city1 015146 gt city2 048017 gt
  • 物化视图提交时快速刷新

    我刚刚创建了表 DEPT 和 EMP 如下所示 create table DEPT dept no number dept name varchar 32 dept desc varchar 32 CONSTRAINT dept pk Pr
  • 将一个巨大的字符串参数传递给存储过程

    我有一个存储过程 它有两个参数 ID 和日期 当我将大文本传递给 ID 参数时 仅考虑部分文本 就好像文本在某个地方被剪切一样 我想这是因为当我执行存储过程时如下 exec proc 1 2 3 4 20100101 一切正常 但是当我使用
  • python 求数组中正数之和的函数

    我需要编写一个函数 它接受一个数字数组并找到所有数字的最大和 换句话说 我需要找到正数的总和 我写了这个 我收到 列表超出范围 想法 def maximum sub A x 0 i 0 for i in A while A i gt 0 x
  • 具有不同高度块的三列布局

    我有基于 Twitter Bootstrap 的简单 3 列布局 唯一的问题是 每根柱子都是由不同高度的块组装而成 div class container div class row div class span4 div class bl
  • 笛卡尔坐标到极坐标

    看一下这里的例子 http www brianhare com physicals so html http www brianhare com physics so html 看一下 console log 我在其中使用了这两个主要函数
  • capybara - 单击没有 id 的按钮

    我正在尝试单击此 html 代码中的按钮 div class modal footer div
  • 无法在 Sql Server 中运行分析功能

    在 Oracle 中它运行良好 oracle的查询如下 SELECT TEAM ID LEVEL ID FF ID MODULE ID TERR ID MERGE KEY count distinct TERR ID over partit
  • DateTimeOffset解析和自定义时区

    我们将 XML DateTime 值解析为 DateTimeOffset 值 根据DateTime 的 W3C XSD 文档 http www w3 org TR 2012 REC xmlschema11 2 20120405 dataty
  • $(this).dequeue();与下一个();

    如果我这样做有什么区别吗 queue queue function next next queue function next next versus queue queue function this dequeue queue func
  • 在我的 Linux 机器上安装 lisp

    我使用 Vim 作为我的编辑器 Practical common Lisp 建议安装 Lispbox 我不知道如何使用 emacs 不知道如何用那个 T T 运行 lisp 代码 之后我找到了一个名为 limp vim 的 vim lisp
  • Wordpress 插件 - 调用未定义的函数 finfo_open() [重复]

    这个问题在这里已经有答案了 我正在尝试使用CSV Me http wordpress org plugins csv me 插件 以便让我们的客户将 csv 文件上传到数据库 当我尝试上传文件作为测试时 我收到以下错误消息 Fatal er
  • 从扩展 pug/jade 模板将变量传递到基本布局

    我想通过在扩展基本布局的模板中声明变量来在 body 标记上设置一个类 当我尝试时 body class变量是undefined在布局中 看起来布局是在扩展模板之前执行的 或者它们是在不同的范围内执行的 还有别的办法吗 mixin 在这里可
  • 将搜索栏从 magento 主页的标题中移动

    我是 magento 的新手 我想将搜索栏从标题移动到主页的中间位置 以便它仅显示在主页上 我在 magento 论坛上阅读了许多相关答案 但所有人都在尝试编辑 box css 中的 mini search 元素 但不幸的是我在此文件中没有
  • 如何在CouchDB 2.0中创建TEXT索引?

    我正在读这篇文章https cloudant com blog mango json vs text indexes https cloudant com blog mango json vs text indexes我想在我的 Couch
  • Dagger 2.10 Android 子组件和构建器

    使用新的 2 10 中 dagger android 类 我尝试使用依赖于其他模块的子组件来注入东西 因此 有一个带有这些模块的设置器的构建器 有关的文档https google github io dagger android html
  • FileStream.(Begin/End)(Read/Write)的同步要求

    Net 可以接受以下多线程调用模式吗文件流 http msdn microsoft com en us library y0bs3w9t 28v VS 90 29 aspx 多个线程调用这样的方法 ulong offset whatever