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