【问题标题】:Writing stream of inputted Byte Arrays to file over several minutes (C#)在几分钟内将输入的字节数组流写入文件(C#)
【发布时间】:2017-07-06 22:22:42
【问题描述】:

我正在创建一个通过串行从微处理器中提取数据的 GUI 工具。我想在提取时将要提取的字节数组以块的形式保存到 .dat 文件中。我尝试使用文件流,但该过程需要几分钟时间,因此当文件流打开时 GUI 会冻结。

如何在不冻结 GUI 的情况下长时间多次保存到文件流?

我应该只存储提取的字节数组,然后再写入文件吗?我打算这样做,但它需要一个包含超过 800 万个元素的字节数组,所以我认为这不是最好的主意。

【问题讨论】:

  • 在不同的线程中做
  • 我通常在 BackWorker 进程中进行。相当于 Thomas 推荐的。
  • 打开文件不会使 UI 冻结。 UI 冻结是因为您在某个地方处于循环状态。

标签: c# arrays filestream


【解决方案1】:

如果您使用的是 .NET Framework 4 或更高版本,则可以使用任务。然后您还可以使用ContinueWith 方法在完成时更新 UI:

Task writeTask = Task.Factory.StartNew(() =>
{
    // Write to file
}).ContinueWith(previousTask =>
{
    // Update the UI
});

如果您使用的是旧版本的 .NET Framework,您可以使用 Task Parallel Library 或显式使用线程。

您可以通过创建一个新的或使用线程池来做到这一点:

Thread thread = new Thread(() =>
{
    // Write to file
});
// Make the thread a background thread if you want it to be aborted
// when the main thread is stopped, i.e. the application is closed:
thread.IsBackground = true;
thread.Start();

-

ThreadPool.QueueUserWorkItem(state =>
{
    // Write to file
});

恕我直言,我更喜欢使用任务而不是线程和线程池而不是创建新线程。但是,你要记住,使用线程池并不能保证直接执行,而是当线程池线程可用时。

【讨论】:

    【解决方案2】:

    如果您想打开一个文件并向其抛出数据块,一种简单的方法是使用 BlockingCollection。您有一个线程在等待收集块并写入它们,并在您的数据收集线程中将数据块发布到集合中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-10
      • 2015-10-03
      • 1970-01-01
      • 2022-01-10
      • 2019-02-07
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      相关资源
      最近更新 更多