在几分钟内将输入的字节数组流写入文件 (C#)
Writing stream of inputted Byte Arrays to file over several minutes (C#)
我正在创建一个 GUI 工具,它通过串口从微处理器中提取数据。我想将正在提取的字节数组在提取时以块的形式保存到 .dat 文件中。我尝试使用文件流,但该过程需要几分钟时间,因此 GUI 在文件流打开时冻结。
如何在不冻结 GUI 的情况下长期多次保存到文件流?
我应该只存储提取的字节数组,然后再写入文件吗?我打算这样做,但它需要一个包含超过 800 万个元素的字节数组,所以我认为这不是最好的主意。
如果您想打开一个文件并向其扔数据块,一种简单的方法是使用 BlockingCollection。您有一个线程在等待收集,该线程选择块并写入它们,并且在您的数据收集线程中 post 数据块到集合
如果您使用的是 .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
});
恕我直言,我更喜欢使用任务而不是线程,使用线程池而不是创建新线程。但是,你要记住,使用线程池并不能保证直接执行,而是当一个线程池线程可用时。
我正在创建一个 GUI 工具,它通过串口从微处理器中提取数据。我想将正在提取的字节数组在提取时以块的形式保存到 .dat 文件中。我尝试使用文件流,但该过程需要几分钟时间,因此 GUI 在文件流打开时冻结。
如何在不冻结 GUI 的情况下长期多次保存到文件流?
我应该只存储提取的字节数组,然后再写入文件吗?我打算这样做,但它需要一个包含超过 800 万个元素的字节数组,所以我认为这不是最好的主意。
如果您想打开一个文件并向其扔数据块,一种简单的方法是使用 BlockingCollection。您有一个线程在等待收集,该线程选择块并写入它们,并且在您的数据收集线程中 post 数据块到集合
如果您使用的是 .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
});
恕我直言,我更喜欢使用任务而不是线程,使用线程池而不是创建新线程。但是,你要记住,使用线程池并不能保证直接执行,而是当一个线程池线程可用时。