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