非同期I/Oをお勧めします。セットアップが少し簡単で、新しいスレッドを自分で作成する必要はありません。
非同期プログラミングでは、たとえば書き込みたいファイルストリームがありますが、終了するまで待機したくない場所です。あなたは完了したときに通知を受けることを望むかもしれませんが、あなたは待っていません。
何をしてStreamクラスに用意されていBeginWrite/BeginReadとEndWrite/EndReadの機能を使用しています。
あなたのメソッドでは、BeginWriteを書いて、コールバック関数で渡すすべてのデータを呼び出すことから始めます。この関数は、BeginWriteが終了したときに呼び出されます。
コールバック関数では、EndWriteを呼び出してストリームをクリーンアップし、エラーをチェックします。
BeginWriteはブロックされません。これは、スレッドがそのハンドラを終了し、他のイベント(他のGUIイベントなど)を処理し続けるイベントハンドラ内から呼び出された場合に発生します。メインスレッドが殺された場合のものを書くのスレッドが殺されるので
using System;
using System.IO;
using System.Text;
class Program
{
private static FileStream stream;
static void Main(string[] args)
{
stream = new FileStream("foo.txt",
FileMode.Create,
FileAccess.Write);
const string mystring = "Foobarlalala";
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] data = encoding.GetBytes(mystring);
Console.WriteLine("Started writing");
stream.BeginWrite(data, 0, data.Length, callback, null);
Console.WriteLine("Writing dispatched, sleeping 5 secs");
System.Threading.Thread.Sleep(5000);
}
public static void callback(IAsyncResult ia)
{
stream.EndWrite(ia);
Console.WriteLine("Finished writing");
}
}
}
睡眠はとても重要です。この小さな例では、GUIアプリケーションでは問題ありません。
MSDNあなたはbackgroundworkerやThreadPoolのために行く場合には、一般的に非同期プログラミングにこのようなものを書く方法についてpretty good overviewを持っており、またいくつかのgood articles。
私は、データのコピーを作成し、UIの一部を無効にするのではなく、バックグラウンドワーカーにそれを渡す方が良いと思います。 – Quibblesome
@Quarrelome:時には。それは実際の状況と、結果がスナップショットになるかどうかをユーザーが期待するかどうかによって異なります。また、いくつかのケースでは、完全なスナップショットを取ることは本当に難しいかもしれません - それは壊れたものよりも信頼できるが少し迷惑なプログラムを持っている方が良いです:) –