- PR -

非同期のI/Oの実装(NetFramework)

1
投稿者投稿内容
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2003-07-26 00:11
非同期I/Oの非同期とは、下記a,bどちらの実装がなされているのでしょうか?
(質問はFileStreamを想定しています)

a:単にコマンドの終了を待たずに次に進むだけでコマンドの発行順序は考慮されない。
b:コマンドが発行順に待ち行列にキューイングされているため、遅延は発生しても、
 コマンドは発行された順序に正確に実行されることが期待できる。

例えば(Open→BeginWrite/BeginRead/BeginWrite/BeginRead→Close)を
何回もくり返すような場合
aの実装ではプログラム側で、前の操作が完了しているかどうかを
いちいちチェックしなければならなくなります。
bの実装では気にする必要は無いことになると思います。
mei
大ベテラン
会議室デビュー日: 2003/04/08
投稿数: 114
投稿日時: 2003-07-27 11:46
こんにちは、meiです。

引用:

伊藤さんの書き込み (2003-07-26 00:11) より:
非同期I/Oの非同期とは、下記a,bどちらの実装がなされているのでしょうか?
(質問はFileStreamを想定しています)

a:単にコマンドの終了を待たずに次に進むだけでコマンドの発行順序は考慮されない。
b:コマンドが発行順に待ち行列にキューイングされているため、遅延は発生しても、
 コマンドは発行された順序に正確に実行されることが期待できる。


ヘルプより引用
>複数の非同期要求を同時に実行した場合、要求の完了順序は不定です。
と、あるのでaではないかと思います。

ところで、非同期IOを使用する用途は、
インタフェース部分のレスポンスとため、
ファイルアクセスをバックグラウンドで走らせたいということでしょうか?
もし、そうなら専用でThreadを作った方が良い気がします。
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2003-07-28 00:31
計測データを集計して毎秒1回同一ファイルに対してログを追加しています。
(Open/Append/Close)
計測プログラムをノンストップで動かしながらエクスプローラでバックアップも
したいのでずっとOpenしっ放しにせず一応Appendした後に毎回Closeをすることに
しています。しかし、今回はログの書き込み用途で、しかも1秒ごとにきっちり
書き込まれていなくてはならないという精度は要求されていません。パソコンが
暇な時、例えば10秒跡にどさっと書き込まれても一向に構わない内容の仕事な
のです。ただ、データの生成量が多いときがあります。(200KB/sec)
確かにスレッドを作成すれば万全ですね。(未だマルチスレッド使った事ないけど)
非同期I/Oに書き換えるだけで効果があるのであればプログラムの変更も少なそう
だしありがたいと思っています。
mei
大ベテラン
会議室デビュー日: 2003/04/08
投稿数: 114
投稿日時: 2003-07-28 02:01
こんばんは、meiです。

引用:

ひろしさんの書き込み (2003-07-28 00:31) より:
確かにスレッドを作成すれば万全ですね。(未だマルチスレッド使った事ないけど)
非同期I/Oに書き換えるだけで効果があるのであればプログラムの変更も少なそう
だしありがたいと思っています。



私もスレッドはほとんど使ったことがないので、
自信無いですがこんな感じでしょうか?

コード:
using System;
using System.Collections;
using System.Threading;

public class MyApp {
	private static Queue que = Queue.Synchronized(new Queue());

	public static void Main() {
		Thread work = new Thread(new ThreadStart(Worker));

		// ワーカーの完了を待たない
		work.IsBackground = true;
		// スレッド開始
		work.Start();

		for (int i = 0; i < 100; ++i) {
			// 書き込み内容をキューへ追加
			string data = "No." + i.ToString();
			que.Enqueue(data);
			// テストのためのダミー(不要)
			Thread.Sleep(10);
		}

		// キューの作業終了を待つ
		while (que.Count > 0)
			Thread.Sleep(0);
	}

	// 作業スレッド
	public static void Worker() {
		while (true) {
			// キューにデータがあったら書き込む
			while (que.Count > 0) {
				string s = (string)que.Dequeue();
				Console.WriteLine(s);
			}
			// テストのためのダミー(不要)
			Thread.Sleep(500);
		}
	}
}



ちょっと動かした感じは大丈夫そうだけど、果たして・・・
なな
ぬし
会議室デビュー日: 2003/06/22
投稿数: 659
お住まい・勤務地: 愛知県
投稿日時: 2003-07-28 08:18
> しています。しかし、今回はログの書き込み用途で、しかも1秒ごとにきっちり
> 書き込まれていなくてはならないという精度は要求されていません。パソコンが

件名とはズレてしまいますが...
計測・制御系のプログラムの場合、マルチスレッドにしたほうが良いですよ。
例えば、シングルスレッドで周期的にデータ収集していても、ウィンドウを握って
ぐりぐり移動すると...周期性が保たれなくなります。
少なくとも、ウィンドウ処理と、計測・制御処理(いわゆるワーカー)は分けたほうが良いです。

最初の敷居は高いですが、是非マルチスレッドでご検討ください。

# 要求される精度によって、Windowsでだめな場合がありますけど...
1

スキルアップ/キャリアアップ(JOB@IT)