クラスのインスタンスを作成し、そのメソッドを使用してスレッドの整合性を開始するとき、スレッドの安全性はあまり重要ではありませんか?スレッドの安全性はいつ問題になりますか?
答えて
複数のスレッドが同じオブジェクトインスタンスにアクセスしている場合は、あなたがスレッドの安全性を確保するためにロックを追加する必要があります:サイドノートとして
// make sure that this is defined *outside* the method
// so that all threads lock on the same instance
private readonly object _lock = new object();
...
// add a lock inside your event handler
proc.OutputDataReceived += (object sendingProcess, DataReceivedEventArgs e) =>
{
if (e.Data != null)
{
lock (_lock)
info.additional += e.Data;
}
};
、あなたは.NET 4を使用している場合は、あなたがチェックしたい場合がありますConcurrentQueue
クラス。別のスレッドでアイテムをデキューするには
private ConcurrentQueue<SomeInfo> _queue = new ConcurrentQueue<SomeInfo>();
...
proc.OutputDataReceived += (object sendingProcess, DataReceivedEventArgs e) =>
{
if (e.Data != null)
{
// no need to lock
_queue.Enqueue(e.Data);
}
};
、あなたが使用します:それは、複数のスレッドが同時にそのアイテムをキューに入れる必要がある場合に役立つことができFIFOバッファのスレッドセーフな実装だ
SomeData data = null;
while (_queue.TryDequeue(out data))
{
// do something with data
}
複数のスレッドがアクセスしていない同じオブジェクト。各スレッドのプロセスを開始するクラスのインスタンスを作成します。 –
キューは問題ではありません。私が信じている出力リダイレクションです。 –
@Joey:これをイベントハンドラに追加します: 'Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId);'。私はあなたがコンソールに書き込まれた別のスレッドIDを取得する必要がありますと信じています。 – Groo
何オブジェクトの種類は情報ですか? –
編集編集をご覧ください。 –
これが役立つかどうかわからないが、私がここに投稿した答えをチェックアウトする:http://stackoverflow.com/questions/5187568/delays-when-reading-process-output-asynchronously/5187715#5187715 –