2017-07-06 15 views
0

私はシリアル経由でマイクロプロセッサからデータを抽出するGUIツールを作成しています。 .datファイルに抽出するバイト配列を抽出する際に、それらをチャンクに保存したい。私はファイルストリームを使用しようとしましたが、プロセスは数分間かかるので、ファイルストリームが開いている間にGUIがフリーズします。入力されたバイト配列のストリームを数分かけてファイルに書き込む(C#)

GUIをフリーズせずに長期間に渡ってファイルストリームに複数回保存するにはどうすればよいですか?

抽出したバイト配列を保存してから、ファイルに書き込むだけでいいですか?私はこれをやろうとしていましたが、800万以上の要素を持つバイト配列が必要になりますので、それは最善の考えではないと思いました。

+0

これは別のスレッドで行います –

+0

私は通常、BackWorkerプロセスで実行します。トマスが推薦したのと同じです。 – jdweng

+0

ファイルを開いていないとUIがフリーズしません。どこかでループしているので、UIがフリーズします。 – pm100

答えて

0

.NET Framework 4以降を使用している場合は、タスクを使用できます。あなたはTask Parallel Libraryを使用するか、明示的にスレッドを使用することができますいずれかの.NET Frameworkの古いバージョンを使用している場合

Task writeTask = Task.Factory.StartNew(() => 
{ 
    // Write to file 
}).ContinueWith(previousTask => 
{ 
    // Update the UI 
}); 

:次に、あなたはまた、完了時にUIを更新するためにContinueWith方法を利用することができます。

あなたはどちらか新しいものを作成したり、スレッドプールを使用してこれを行うことができます。

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 
}); 

私見。ただし、スレッドプールを使用しても、直接実行することは保証されませんが、スレッドプールスレッドが使用可能になった場合は、注意する必要があります。

0

ファイルを開いてブロックをスローするには、BlockingCollectionを使用するのが簡単です。コレクションを待機しているスレッドが、ブロックを選択して書き込み、データ収集スレッドでデータブロックをコレクションに投稿します。

関連する問題