我正在创建一个通过串行从微处理器提取数据的GUI工具。我想将提取的字节数组以块形式提取到一个.dat文件中。我尝试使用文件流,但是这个过程需要几分钟时间,因此当文件流打开时GUI冻结。在几分钟内将输入的字节数组写入文件(C#)
如何在不冻结GUI的情况下长时间多次保存到文件流?
我应该只是存储提取的字节数组,然后写入文件后?我打算这样做,但它需要一个拥有800多万个元素的字节数组,所以我认为这不是最好的主意。
我正在创建一个通过串行从微处理器提取数据的GUI工具。我想将提取的字节数组以块形式提取到一个.dat文件中。我尝试使用文件流,但是这个过程需要几分钟时间,因此当文件流打开时GUI冻结。在几分钟内将输入的字节数组写入文件(C#)
如何在不冻结GUI的情况下长时间多次保存到文件流?
我应该只是存储提取的字节数组,然后写入文件后?我打算这样做,但它需要一个拥有800多万个元素的字节数组,所以我认为这不是最好的主意。
如果您使用.NET Framework 4或更高版本,则可以使用任务。如果您在使用.NET Framework的旧版本,你可以使用Task Parallel Library或明确地使用一个线程
Task writeTask = Task.Factory.StartNew(() =>
{
// Write to file
}).ContinueWith(previousTask =>
{
// Update the UI
});
:那你也可以使用ContinueWith
方法来完成对更新UI。
您可以通过创建一个新的或使用线程池这样做:
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。您有一个线程正在等待集合中选择块并将它们写入并在您的数据收集线程中将数据块发布到集合
在不同的线程中执行它 –
我通常在BackWorker进程中执行此操作。等同于Thomas推荐的内容。打开文件的 – jdweng
不会使UI冻结。用户界面冻结,因为你在一个循环的某个地方。 – pm100