异步写入文件

2024-01-10

有没有办法编写一个异步函数来重复将数据写入文件。

当我编写异步函数时出现以下错误

该进程无法访问文件“c:\Temp\Data.txt”,因为该文件正在被另一个进程使用

public void GoButton_Click(object sender, System.EventArgs e)
{
    IAsyncResult ar = DoSomethingAsync(strURL, strInput);
    Session["result"] = ar;
    Response.Redirect("wait1.aspx");
}

private IAsyncResult DoSomethingAsync(string strURL, string strInput)
{
    DoSomethingDelegate doSomethingDelegate = new DoSomethingDelegate(DoSomething);
    IAsyncResult ar = doSomethingDelegate.BeginInvoke(strURL, strInput, new AsyncCallback(MyCallback), null);
    return ar;
}

private delegate void DoSomethingDelegate(string strURL, string strInput);

private void MyCallback(IAsyncResult ar)
{
    AsyncResult aResult = (AsyncResult)ar;
    DoSomethingDelegate doSomethingDelegate = (DoSomethingDelegate)aResult.AsyncDelegate;
    doSomethingDelegate.EndInvoke(ar);
}

private void DoSomething(string strURL, string strInput)
{
    int i = 0;
    for (i = 0; i < 1000; i++)
    {
        m_streamWriter.BaseStream.Seek(0, SeekOrigin.End); 
        m_streamWriter.WriteLine("{0} ", MethodCall(strURL, strInput));
        m_streamWriter.Flush();
        m_streamWriter.Close();
    }
}

好吧,我也有同样的问题。现在解决了。这是一种迟到的建议,但可能对其他人有帮助。

在下面的控制台示例中包含以下 using 语句。

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
Use of the FileStream Class

下面的示例使用 FileStream 类,该类具有导致在操作系统级别发生异步 I/O 的选项。在许多情况下,这将避免阻塞 ThreadPool 线程。要启用此选项,必须在构造函数调用中指定 useAsync=true 或 options=FileOptions.Asynchronous 参数。

如果直接通过指定文件路径打开StreamReader和StreamWriter则没有该选项。如果您向 StreamReader/Writer 提供由 FileStream 类打开的 Stream,则它们确实有此选项。请注意,即使线程池线程被阻塞,异步也会在 UI 应用程序中提供响应能力优势,因为 UI 线程在等待期间不会被阻塞。

书写文字

以下示例将文本写入文件。在每个等待语句处,该方法立即退出。当文件 I/O 完成时,该方法将从await 语句后面的语句处恢复。请注意,async 修饰符位于使用await 语句的方法的定义中。

static void Main(string[] args)
{
    ProcessWrite().Wait();
    Console.Write("Done ");
    Console.ReadKey();
}

static Task ProcessWrite()
{
    string filePath = @"c:\temp2\temp2.txt";
    string text = "Hello World\r\n";

    return WriteTextAsync(filePath, text);
}

static async Task WriteTextAsync(string filePath, string text)
{
    byte[] encodedText = Encoding.Unicode.GetBytes(text);

    using (FileStream sourceStream = new FileStream(filePath,
        FileMode.Append, FileAccess.Write, FileShare.None,
        bufferSize: 4096, useAsync: true))
    {
        await sourceStream.WriteAsync(encodedText, 0, encodedText.Length);
    };
}

阅读文字

以下示例从文件中读取文本。文本被缓冲,并且在本例中被放入 StringBuilder 中。与前面的示例不同,await 的计算会生成一个值。 ReadAsync 方法返回一个Task,因此await 的计算会生成一个Int32 值(numRead),该值在操作完成后返回。

static void Main(string[] args)
{
    ProcessRead().Wait();
    Console.Write("Done ");
    Console.ReadKey();
}

static async Task ProcessRead()
{
    string filePath = @"c:\temp2\temp2.txt";

    if (File.Exists(filePath) == false)
    {
        Console.WriteLine("file not found: " + filePath);
    }
    else {
        try {
            string text = await ReadTextAsync(filePath);
            Console.WriteLine(text);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}

static async Task<string> ReadTextAsync(string filePath)
{
    using (FileStream sourceStream = new FileStream(filePath,
        FileMode.Open, FileAccess.Read, FileShare.Read,
        bufferSize: 4096, useAsync: true))
    {
        StringBuilder sb = new StringBuilder();

        byte[] buffer = new byte[0x1000];
        int numRead;
        while ((numRead = await sourceStream.ReadAsync(buffer, 0, buffer.Length)) != 0)
        {
            string text = Encoding.Unicode.GetString(buffer, 0, numRead);
            sb.Append(text);
        }

        return sb.ToString();
    }
} 

原始来源是here http://blogs.msdn.com/b/csharpfaq/archive/2012/01/23/using-async-for-file-access-alan-berman.aspx但不幸的是,该链接现在似乎已失效。

可以找到新的来源here https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/using-async-for-file-access.

希望有帮助...

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

异步写入文件 的相关文章

  • 在 C# 中实例化 python 类

    我已经用 python 编写了一个类 我想通过 IronPython 将其包装到 net 程序集中 并在 C 应用程序中实例化 我已将该类迁移到 IronPython 创建了一个库程序集并引用了它 现在 我如何真正获得该类的实例 该类看起来
  • ASP .NET MVC 5 - 客户地址一对一关系

    我在这里查看了论坛 实际上发现了一些类似的问题 但不是相同的问题 类似的解决方案没有给我正确的答案 我正在使用实体框架和代码优先方法来处理 ASP NET MVC 5 我想建立客户 gt 地址一对一关系的模型 我建模的是 客户等级 publ
  • 实体框架 5 不清除导航属性

    我在 Entity Framework 5 中遇到了这个奇怪的问题 我在其中一个实体中有一个导航属性 我想将其设置为null 但由于某种原因 该属性只有在我第二次调用该属性时才会被清除 using var db new Entities v
  • 将 Uploadify 与 Sharepoint 和 .net 结合使用

    我在共享点页面上有一些由 JQuery 生成的 html 我想在这个 html 中使用 uploadify 将文件上传到服务器 亚历山大 https stackoverflow com users 25427 alexander gyosh
  • 将 gcov 与 CMake/CDash 结合使用的详细指南?

    我在我的项目中使用 CMake 并设置了 cdash 服务器以进行连续 夜间构建 一切运行良好 通过设置 crontab 我们可以将每小时 每晚的构建 测试结果自动上传到我们的 cdash 服务器 我的下一步是将测试覆盖率报告添加到构建中
  • 如何在Qt无框窗口中实现QSizeGrip?

    如何使用 Qt 无框窗口实现 QSizeGrip 代码会是什么样的 您只需在布局内窗口的一角添加 QSizeGrip 即可使其保持在该角落 QDialog dialog new QDialog 0 Qt FramelessWindowHin
  • string.empty 和 string[0] == '\0' 之间的区别

    假设我们有一个字符串 std string str some value is assigned 有什么区别str empty and str 0 0 C 11 及更高版本 string variable 0 如果字符串为空 则需要返回空字
  • 第一次在更新面板中自动将文件上传到服务器不起作用

    要求 我正在尝试在用户选择文件后立即上传该文件 我必须满足以下要求 该按钮看起来与应用程序中的其他按钮类似 用户选择文件后就会上传该文件 我需要它位于 UpdatePanel 中 因为我必须对页面进行有条件的更新 我CAN对所选文件进行完整
  • 输入缓冲区刷新

    考虑下面的代码 include
  • 如何使用 ASP.NET MVC 4.0 DonutOutputCache VaryByCustom 使缓存失效

    我正在为我的 ASP NET 应用程序使用 DevTrends MvcDonutCaching 包 它工作得很好 我目前遇到的一个问题是使我为子操作设置的 VaryByCustom 缓存无效 这是我用于 VaryByCustom 设置的一些
  • 使用 microsoft word.interop 删除 Word 文档中的空白页

    我创建了一个Word文档 它使用以下命令生成动态内容词互操作 它有一些分页符之间使用 我面临的问题是 此分页符会创建我不想向用户显示的空白页面 在某些情况下 我需要在那里添加这些分页符以维护页面布局 因此我无法考虑删除这些分页符 但我想要的
  • 如何解决素数函数的大O表示法?

    我正在尝试理解 Big O 表示法 很抱歉 如果我问的问题太明显了 但我似乎无法理解这一点 我有以下 C 代码函数 我正在尝试为其计算 Big O 表示法 for i 2 i lt 100 i for j 2 j lt i j j if i
  • 如何在单独的类库中管理客户端上下文对象?

    我正在尝试创建一个库 类库 对于共享点 它将拥有所有共享点 dll 来与共享点服务器交互上传文件 文档并创建文档库和文档集 现在这个库可以被使用客户端 例如 Web 应用程序 asp net webform 或 mvc 或控制台应用程序或
  • 为什么long long 2147483647 + 1 = -2147483648? [复制]

    这个问题在这里已经有答案了 为什么这段代码不打印相同的数字 long long a b a 2147483647 1 b 2147483648 printf lld n a printf lld n b 我知道int变量的最大数量是2147
  • MSBuild 将动态生成的文件复制为项目依赖项的一部分

    我有一个自定义 msbuild 任务 它正在生成一些输出文件到 ProjectA 的输出目录 TargetDir 当前的代码是这样的
  • C#中如何将委托转换为对象?

    我正在使用反射类来调用其他 dll 上的一些方法 方法的参数之一是委托类型 我想通过使用反射来调用这个方法 所以我需要将函数参数作为对象数组传递 但我找不到任何关于 如何将委托转换为对象 提前致谢 委托是一个对象 只需像平常一样创建预期的委
  • 将 libpng 链接到 android 原生项目

    我在尝试在本机 Android 项目中加载 libpng 时遇到问题 编译器似乎无法识别 libpng 函数 但可以识别类型 如 png byte 它可以正常编译类型 但如果我添加函数 则会抛出错误 这是编译输出 Windows 7 cmd
  • 为什么 C# 编译的正则表达式比等效的字符串方法更快?

    每次我必须对字符串执行简单的包含或替换操作 其中我正在搜索的术语是固定值 时 我发现如果我获取示例输入并对其进行一些分析 则使用编译的正则表达式是几乎 总是比使用 String 类中的等效方法更快 我尝试过比较多种方法 hs是要搜索的 干草
  • 正则表达式基于组的不同替换?

    所以我对正则表达式比较陌生 并且做了一些练习 我正在玩一个简单的 混淆器 它只是寻找 dot or dot or at or at 不区分大小写 并且在匹配项之前或之后有或没有任意数量的空格 这是针对通常情况的 someemail AT d
  • 从哪里开始阅读 SQLite 源代码? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想了解sqlite是如何实现的 并且 想阅读源代码 我已经下载了源代码 我应该开始查看代码的哪一部分 SQLite文档页 http

随机推荐

  • 如何处理选项卡更改时的 CSS 动画

    我正在开发一个小轮盘游戏 例如 https csgofast com https csgofast com 我的问题是 当我在实际选项卡中时 与变换和过渡一起使用的轮盘动画效果很好 问题是 当我移动到另一个选项卡或最小化时 在轮盘赌开始之前
  • 在 Web Api 控制器中将 JSON 反序列化为字典

    我有这样的 JSON 字符串 1 1 3 5 2 2 5 6 3 5 6 8 我想将其发送到 Web Api 控制器而不使用 ajax 请求进行更改 ajax type POST url Api Serialize Dict data JS
  • 设置HBase、hadoop、hive通过hive访问Hbase的正确方法是什么?

    我在配置和安装 hbase hadoop hive 时遇到问题 到目前为止我在 ubuntu 14 04 3 LTS 的虚拟机上做了什么 像这样安装了jdk和版本jdk1 8 0 60 https askubuntu com questio
  • 根据 textContent 中的索引突出显示文本

    Bounty 正如 jsPerf 所展示的 测试时最新发布版本的 Firefox Chrome 和 Internet Explorer 中最快的解决方案将获得奖励or创建此类解决方案最有用的答案由我自行决定 哇哈哈 I ll be most
  • 卸载后执行命令

    我需要卸载才能运行命令after它删除了已安装的文件 UninstallRun 没有用 据我所知 它在文件被删除之前运行 我有点需要一个 卸载后 标志 关于我如何实现上述目标有什么建议吗 See 卸载事件函数 http www jrsoft
  • 包含过期项的哈希表

    我想实施一个HashTable 或者也许是一个HashSet or Dictionary 其中有独特的成员 一段时间后就会过期 例如 Items expire automatically after 10 seconds Expiratio
  • Celery:WorkerLostError:工作人员过早退出:信号 9 (SIGKILL)

    我在 Django 应用程序 在 Elastic Beanstalk 上 中使用 Celery 和 RabbitMQ 来管理后台任务 并使用 Supervisor 对其进行守护进程 现在的问题是 我定义的周期任务之一失败 在正常工作一周后
  • 7u45 webstart 中出现新的死锁错误?

    java 7u45 的乐趣仍在继续 这次是 webstart 内部陷入僵局 这种情况在启动大型应用程序 约 100 个 jar 时非常一致地 每次 发生 还有其他人遇到过这个问题或知道任何解决方法吗 除了恢复到 1 7 0 40 之外 Th
  • Jekyll 自动目录

    我已经建立了一个基于 Jekyll 代码的网站阿帕奇构建者 http buildr apache org Buildr 网站根据标题中的标题自动为每个页面生成一个目录 textile格式文件 例如 您使用纺织品编写一个页面 标记出标题 如下
  • zftool 的行为不符合预期

    我在 Linux 中有一个托管服务 我正在尝试在 zend Framework 2 上开发一个应用程序 我想使用 zftool 但无论我运行哪个 zftool 命令 我总是得到主页的 HTML 我将非常感谢任何帮助 以下是重现步骤 1 我安
  • 以角度 2 实现旋转器

    我尝试在我的应用程序中使用微调器 因为有大量数据需要时间来加载 但这是问题所在 我已将此链接作为参考 Angular2 的预引导加载屏幕 https stackoverflow com questions 35243443 pre boot
  • C++ 中的引用计数究竟意味着什么?

    到底什么是引用计数 特别是对于 C 来说它是什么 如果我们不处理这些问题 我们可能会面临哪些问题 所有语言都需要引用计数吗 到底什么是引用计数 特别是对于 C 来说它是什么 简单来说 引用计数就是对某个对象的引用进行计数 通常 C 采用以下
  • 如何将 vim 选项的值复制到寄存器

    在 vim 中你可以设置选项 set 例如 设置咒语 启用拼写控制 和 设置拼写文件 home custom spell txt 设置自定义拼写文件的位置 您可以使用 echo 打印选项的值 例如 回声 拼写文件 现在我想将选项拼写文件的值
  • Ubuntu下Visual Studio Code显示错误

    我的 Visual Studio Code 遇到了好几天的问题 无法启动它 事实上 窗口几乎全黑 这是我从终端启动它时的控制台输出 bash impossible de r gler le groupe de processus du te
  • 如何构建具有未知列数的 WPF 数据网格

    我需要从 txt 中获取的字符串数组集合构建并显示 WPF 数据网格 问题是我不知道先验的列数 即单个数组中的项目数 所以我在我的xaml中定义
  • MySQL 上 NOT IN 的替代方案

    我有一个疑问 SELECT DISTINCT phoneNum FROM Transaction Register WHERE phoneNum NOT IN SELECT phoneNum FROM Subscription LIMIT
  • 如何使用 EF4 Fluent API 将删除级联到链接表中?

    我在现有 MSSQL 2008 R2 数据库中有两个表 它们通过链接表关联 这两个表是 计划 和 提示 链接表是 PlanTipLinks 计划可以有许多提示 并且提示可以与多个计划关联 即 这是多对多的关系 在应用程序中 我只关心 Pla
  • 如何在wpf中使富文本框自动调整大小?

    如何让RichTextBox自动调整大小 我希望我的富文本框能够适合我分配给它的任何文本 而无需滚动条 谢谢 Set the HorizontalAlignment and VerticalAlignment除了Stretch 这是默认值
  • 如何向 iso 8583 消息添加使用 jpos 的标头。 - ISO 8583 - jpos

    我是使用 iso 8583 进行开发的新手 我需要在 iso 消息之前添加标头 但我以这种方式实现它们 并且不会将其添加到消息标头中 我究竟做错了什么 我希望你可以帮助我 GenericPackager packager new Gener
  • 异步写入文件

    有没有办法编写一个异步函数来重复将数据写入文件 当我编写异步函数时出现以下错误 该进程无法访问文件 c Temp Data txt 因为该文件正在被另一个进程使用 public void GoButton Click object send