在几分钟内将输入的字节数组流写入文件(C#)
我正在创建一个GUI工具,通过串口从微处理器中提取数据。我想在提取字节数组时将其以块的形式保存到.dat文件中。我尝试使用文件流,但这个过程需要几分钟,因此当文件流打开时GUI会冻结 如何在长时间内多次保存到文件流而不冻结GUI在几分钟内将输入的字节数组流写入文件(C#),c#,arrays,filestream,C#,Arrays,Filestream,我正在创建一个GUI工具,通过串口从微处理器中提取数据。我想在提取字节数组时将其以块的形式保存到.dat文件中。我尝试使用文件流,但这个过程需要几分钟,因此当文件流打开时GUI会冻结 如何在长时间内多次保存到文件流而不冻结GUI 我应该只存储提取的字节数组,然后在之后写入文件吗?我本来打算这样做的,但是它需要一个包含800多万个元素的字节数组,所以我认为这不是最好的主意。如果你想打开一个文件并向它抛出数据块,一个简单的方法就是使用BlockingCollection。有一个线程正在等待集合,该线
我应该只存储提取的字节数组,然后在之后写入文件吗?我本来打算这样做的,但是它需要一个包含800多万个元素的字节数组,所以我认为这不是最好的主意。如果你想打开一个文件并向它抛出数据块,一个简单的方法就是使用BlockingCollection。有一个线程正在等待集合,该线程拾取并写入数据块,并在数据收集线程中将数据块发布到集合中如果您使用的是.NET Framework 4或更高版本,则可以使用任务。然后,您还可以使用
ContinueWith
方法在完成时更新UI:
Task writeTask = Task.Factory.StartNew(() =>
{
// Write to file
}).ContinueWith(previousTask =>
{
// Update the UI
});
如果您使用的是较旧版本的.NET Framework,则可以使用或显式使用线程
您可以通过创建新线程池或使用线程池来执行此操作:
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();
-
我更喜欢使用任务而不是线程和线程池而不是创建新线程。但是,您必须记住,使用线程池并不保证直接执行,而是在线程池线程可用时执行。在其他线程中执行我通常在后台工作进程中执行。与Thomas的建议相同。打开文件不会使UI冻结。用户界面冻结,因为您处于某个循环中。
ThreadPool.QueueUserWorkItem(state =>
{
// Write to file
});