■68474 / ) |
Re[5]: C# 並列処理について |
□投稿者/ のぶ (37回)-(2013/10/22(Tue) 16:04:52)
|
■No68467 (とっちゃん さん) に返信 > .NET 4.5 を利用する場合は、VS2012 あるいはつい先日RTMしたばかりの VS2013(こちらは、4.5.1も利用可能)となります。 > 今後を考えると、早い段階で 2013 に移行してしまうほうがいいかもしれませんね。 > > セットアッププロジェクトを利用していない場合は。。。となりますが。 セットアッププロジェクトは一切使っていないのでこの辺は問題なく移行できます。 # セットアッププロジェクトなくなったのですね。Wixが取り込まれる(?)と以前お見受けしたのですが、どうなったのでしょう? > この部分は、基本的にファイルの移動(若しくは、別ドライブにコピーしてオリジナルを削除)とINIファイルに書き込みということでしょうか。 > だとすると、ストレージ(ディスク)アクセスが中心となります。 > INIファイルを作成というのは、ファイルごとに一つではなく、そのフォルダに一つのINIファイルを作成しそこにファイル情報を記述ですよね? 仰る通りです。 ユーザー用フォルダ内にupdateフォルダとINIファイルを作成し、INIファイルには対象ファイル名を記述し、 updateフォルダ内に対象ファイルをコピーするという事です。
> 考え方としては間違っていません。が、思いっきり競合してます。 ハードウェア的に競合するとは思っていませんでした。 ちなみに、単一のINIファイルを複数のプロセスで書き込むという事はしません。
> それを支えるハードウェア上の処理で順次処理となってしまい、並列化の恩恵にあずかれません。 もしかして、今回行いたいファイル移動等だと並列化は(完全にではないにしろ)無駄足になるのでしょうか?
> ここの回答は、Parallel.ForEach の中身に答えのヒントがありますね。 > > それと、スケジューラオブジェクトは使い捨てではありません。 > スケジューラについては > > var tskSch = TaskScheduler.FromCurrentSynchronizationContext(); > > var task1 = Task.Factory.StartNew(() => { 非同期に処理(); }, cts.Token ); > task1.ContinueWith(arg =>{ 非同期処理が終わったらメインスレッドで処理(); }, tskSch); > var task2 = Task.Factory.StartNew(() => { 別の非同期処理(); }, cts.Token ); > task2.ContinueWith(arg =>{ タスク2が終わった後の処理(); }, tskSch); > > と、書けます。 > 一応、上記例は、task1 の終了を待たずに、task2 が動作しています。 > task2 が動く前にtask1が終了している必要があるならそのように記述する必要があります。 > > どうするかは、いろいろあるので、とりあえず書きません。 > わかりやすい(将来の自分が見ても、読めるコード)ものを目指していけばよいと思います。 この辺りは今は理解できていないっぽいので一度自分で答えらしきものを探って改めてレスさせて頂きます。 (たぶんContinueWithメソッドの引数にあるTaskContinuationOptionsを使用してtask1終了した場合task2を実行するという書き方かと思いますが、うまくいっていません)
|
|