C# 线程安全的StreamWriter 怎么做呢? 2

2023-11-24

所以这是我上一个问题的延续 - 所以问题是 “构建线程安全的程序的最佳方法是什么,因为它需要将双精度值写入文件。如果通过流写入器保存值的函数被多个线程调用?最好的方法是什么? ?”

我修改了MSDN上找到的一些代码,下面怎么样?这个正确地将所有内容写入文件。

namespace SafeThread
{
    class Program
    {
        static void Main()
        {
            Threading threader = new Threading();

            AutoResetEvent autoEvent = new AutoResetEvent(false);

            Thread regularThread =
                new Thread(new ThreadStart(threader.ThreadMethod));
            regularThread.Start();

            ThreadPool.QueueUserWorkItem(new WaitCallback(threader.WorkMethod),
                autoEvent);

            // Wait for foreground thread to end.
            regularThread.Join();

            // Wait for background thread to end.
            autoEvent.WaitOne();
        }
    }


    class Threading
    {
        List<double> Values = new List<double>();
        static readonly Object locker = new Object();
        StreamWriter writer = new StreamWriter("file");
        static int bulkCount = 0;
        static int bulkSize = 100000;

        public void ThreadMethod()
        {
            lock (locker)
            {
                while (bulkCount < bulkSize)
                    Values.Add(bulkCount++);
            }
            bulkCount = 0;
        }

        public void WorkMethod(object stateInfo)
        {
            lock (locker)
            {
                foreach (double V in Values)
                {
                    writer.WriteLine(V);
                    writer.Flush();
                }
            }
            // Signal that this thread is finished.
            ((AutoResetEvent)stateInfo).Set();
        }
    }
}

Thread and QueueUserWorkItem线程可用的最低 API。除非我最终别无选择,否则我不会使用它们。尝试一下Task类用于更高级别的抽象。欲了解详情,请参阅我最近关于该主题的博客文章.

您还可以使用BlockingCollection<double> as a proper生产者/消费者队列,而不是尝试手动构建一个用于同步的最低可用 API.

正确地重新发明这些轮子是非常困难的。我强烈建议使用专为此类需求设计的类(Task and BlockingCollection, 再具体一点)。它们内置于 .NET 4.0 框架中,并且可作为 .NET 3.5 的附加组件.

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

C# 线程安全的StreamWriter 怎么做呢? 2 的相关文章

随机推荐

  • 使用 apache poi 读取 xlsx 时主线程中出现 NoSuchMethodError

    我的代码是 import org apache poi poifs filesystem POIFSFileSystem import org apache poi ss usermodel Workbook import org apac
  • 使用c#删除活动目录中的用户

    我已经编写了一些代码 但不起作用 它抛出异常 发生操作错误 代码 gt DirectoryEntry dirEntry new DirectoryEntry LDAP path admin username admin password d
  • GridView - 使用 CSS 友好的控制适配器删除 EmptyDataTemplate 和 EmptyDataText

    正如问题中指出的 EmptyDataTemplate 和 EmptyDataText 在 GridView 中不起作用 using CSS 友好的控制适配器删除将由 EmptyDataTemplate 填充或在 GridView 中的 Em
  • appfuse 与 roo - 你会使用什么

    Appfuse 与 Roo 您会使用什么以及为什么 各自的优点是什么 根据我给的答案服务器端线程在这个问题上 AppFuse 旨在为您的新项目提供单一的初始支架 这与 Maven 原型或 Eclipse 的 新项目 功能类似 您可以在新项目
  • OSError 故障排除:pty 设备不足

    有时 我在调用时会收到 OSError 异常 并显示消息 out of pty devices pty openpty 当我的脚本的一堆实例同时运行时就会发生这种情况 我达到的极限是什么 我该如何解决这个问题 CentOS 5 6 Pyth
  • 用CSS生成箭头线[重复]

    这个问题在这里已经有答案了 我正在尝试生成一条水平直线 中间有一个细分以显示箭头 这个想法是 该行下方显示的内容将提供有关该行上方显示的内容的详细信息 该行应如下所示 我正在尝试使用纯 HTML 和 CSS 无位图图像 生成它 用于字体真棒
  • 如何绕过 Linux“太多参数”限制

    我必须将 256Kb 的文本作为参数传递给 aws sqs 命令 但在命令行中遇到了大约 140Kb 的限制 这个问题在很多地方都有讨论过自 2 6 23 内核起 该问题已在 Linux 内核中解决 但无法让它发挥作用 我在用3 14 48
  • 如何更改默认分支以推送到 Mercurial 中?

    我喜欢在 Mercurial 中创建命名分支来处理可能需要一段时间编码的功能 所以当我推送时我会执行hg push r default确保我只将更改推送到默认分支 然而 必须记住的是一种痛苦 r default每次我执行推送或传出命令时 所
  • @Temporal(TemporalType.DATE) 与 Oracle 12

    在我们的数据库中 我们有多个带有日期字段的实体 Oracle 将每个日期视为相同的 包含日期和时间部分 然而 JPA 实体通过注释 Temporal 进行区分 当我们想省略时间部分时 我们用 Temporal TemporalType DA
  • 在alertDialog中验证EditText

    我正在尝试添加空字段验证EditText on AlertDialog 但即使字段为空后 也不会显示错误消息 而是AlertDialog正在关闭 但是 如果条件运行良好 因为如果任何字段为空 我将无法进行后期操作 这是我的 Java 示例代
  • 如何使用返回的 linq 变量?

    我决定快速了解一下 LINQ 方面的内容 而不是仅仅使用直接的 foreach 循环 但我在让它工作时遇到了一些麻烦 主要是由于我认为的数据类型 到目前为止 我已经得到了这个 var selectedSiteType from sites
  • 页面的官方 Facebook RSS 提要

    许多人已经描述了如何获取 Facebook 页面的 RSS 数据源 例如 http ahrengot com tutorials facebook rss feed 以下 URL 提供了可口可乐页面的 feed 但是 我似乎无法在 face
  • 在 Web 应用程序之间共享 ASP.NET 资源文件

    我有多个项目需要共享资源文件 resx 已提出将资源文件移动到单独的程序集并让 Web 项目引用它的建议 有如何执行此操作的示例吗 我是否创建一个新的类库项目并将 App GlobalResource 文件夹移到其中 我认为这不会起作用 因
  • 如何使用自然的entrySet()顺序迭代HashMap?

    我的地图包含按字母顺序排序的键 当我显示它时 我使用的是entrySet iterator 但我的结果不是按字母顺序排列的 我如何才能按顺序获得结果 不 您的地图不按字母顺序保存元素 你可能有 put 然后按该顺序 但映射没有定义的迭代顺序
  • 您的 Android App Bundle 使用错误的密钥进行签名。确保您的应用程序包使用正确的签名密钥进行签名,然后重试

    如何使用正确的签名密钥对我的 Android 应用程序包进行签名 我为这个问题把头撞在桌子上大约两个小时 当我最终放弃并填写 重置密钥 请求时 我意识到我当前正在尝试将其上传到错误的项目一直以来 因此 第一步 确认您正在尝试上传到正确的项目
  • 流式 HTTP 响应,刷新到浏览器

    我有如下的观点 from django views decorators http import condition def stream for i in range 0 40 yield 1024 yield d i time slee
  • 贫血领域模型:优点/缺点

    我想知道使用贫血域模型的优点和缺点 请参阅下面的链接 福勒文章 由于 贫血领域模型 是反模式 为什么有这么多系统实现它 我认为有几个原因 1 系统的复杂性 在一个简单的系统中 几乎是您在互联网上找到的所有示例和示例代码 如果我想实现 将产品
  • 如何在单击某些按钮时重新加载我的 UIViewController?

    我正在开发一个 iPhone 应用程序 我有一个UIViewController类中存在一些封面流动画 根据设计 我的视图顶部有一些 5 个按钮 每个按钮都有一个IBAction单击按钮的方法我需要显示具有不同数据的不同组的封面流 并且封面
  • 在 Perl 正则表达式中嵌入评估

    所以我正在编写一个快速的 Perl 脚本 它清理一些 HTML 代码并通过 html gt pdf 程序运行它 我希望丢失尽可能少的信息 因此我想扩展文本区域以适应其中当前的所有文本 在我的例子中 这意味着根据文本框中字符串的值将行数设置为
  • C# 线程安全的StreamWriter 怎么做呢? 2

    所以这是我上一个问题的延续 所以问题是 构建线程安全的程序的最佳方法是什么 因为它需要将双精度值写入文件 如果通过流写入器保存值的函数被多个线程调用 最好的方法是什么 我修改了MSDN上找到的一些代码 下面怎么样 这个正确地将所有内容写入文