r流・c#マルチスレッドの復讐backgroundworker system.componentmodel.backgroundworker...
TRANSCRIPT
![Page 1: R流・C#マルチスレッドの復讐BackGroundWorker System.ComponentModel.BackgroundWorker 処理中にユーザーインターフェイスが応答しな くなることを防ぐために、処理を別スレッドで実](https://reader036.vdocuments.pub/reader036/viewer/2022070923/5fbbe599b48b0c04311ab136/html5/thumbnails/1.jpg)
わんくま同盟東京勉強会 #33
R流・C#マルチスレッドの復讐
Microsoft MVP for Development Tools - Visual C# (April 2007 - March 2010)
Microsoft Certified Professional Developer
- Windows Developer
Microsoft Certified Technology Specialist
- .Net Framework 2.0: Windows Applications
2009年05月16日
R・田中一郎
http://blogs.wankuma.com/rti/
![Page 2: R流・C#マルチスレッドの復讐BackGroundWorker System.ComponentModel.BackgroundWorker 処理中にユーザーインターフェイスが応答しな くなることを防ぐために、処理を別スレッドで実](https://reader036.vdocuments.pub/reader036/viewer/2022070923/5fbbe599b48b0c04311ab136/html5/thumbnails/2.jpg)
わんくま同盟東京勉強会 #33
自己紹介
会員番号:34
名前:R・田中一郎
所在:栃木県
年齢:18才
職業:
主に業務用
システムの開発
2005年11月Microsoft Visual Studio .NET デビュー。この頃から R.Tanaka.Ichiro と名のりネットでアクティブに活動を始める。
2006年02月C# を学び始める。理想的な言語に感動。尊敬する方々の影響も大きい。
2006年09月わんくま同盟加盟ある事件がきっかけで、中さんから声をかけていただき加盟。
2006年11月MSC2006 にて R・田中一郎として始めて人前に姿を晒す。
2007年04月Microsoft MVP for Visual Developer - Visual C# を受賞。
2007年06月わんくま同盟勉強会にてスピーカーデビュー。
2008年04月Microsoft MVP for Development Tools - Visual C# を受賞。
2008年05月70-526,70-536 試験をパス。Microsoft Certified Technology Specialist for .Net Framework 2.0: Windows
Applications 資格取得。
2009年04月Microsoft MVP for Development Tools - Visual C# を受賞。
70-548 試験をパスMicrosoft Certified Professional Developer for Windows Developer 資格取得。
![Page 3: R流・C#マルチスレッドの復讐BackGroundWorker System.ComponentModel.BackgroundWorker 処理中にユーザーインターフェイスが応答しな くなることを防ぐために、処理を別スレッドで実](https://reader036.vdocuments.pub/reader036/viewer/2022070923/5fbbe599b48b0c04311ab136/html5/thumbnails/3.jpg)
わんくま同盟東京勉強会 #33
こんな経験はありませんか?<Demo>
処理中に固まる
クライアントのリクエストが同時に処理できない
CPUがフルパワーで使えない
![Page 4: R流・C#マルチスレッドの復讐BackGroundWorker System.ComponentModel.BackgroundWorker 処理中にユーザーインターフェイスが応答しな くなることを防ぐために、処理を別スレッドで実](https://reader036.vdocuments.pub/reader036/viewer/2022070923/5fbbe599b48b0c04311ab136/html5/thumbnails/4.jpg)
わんくま同盟東京勉強会 #33
通常の処理の流れ
ひとつずつ処理する
処理1
処理2
処理3
![Page 5: R流・C#マルチスレッドの復讐BackGroundWorker System.ComponentModel.BackgroundWorker 処理中にユーザーインターフェイスが応答しな くなることを防ぐために、処理を別スレッドで実](https://reader036.vdocuments.pub/reader036/viewer/2022070923/5fbbe599b48b0c04311ab136/html5/thumbnails/5.jpg)
わんくま同盟東京勉強会 #33
マルチスレッドな処理の流れ
複数の処理を並列に実行できる
処理1
処理2 処理3
処理4
![Page 6: R流・C#マルチスレッドの復讐BackGroundWorker System.ComponentModel.BackgroundWorker 処理中にユーザーインターフェイスが応答しな くなることを防ぐために、処理を別スレッドで実](https://reader036.vdocuments.pub/reader036/viewer/2022070923/5fbbe599b48b0c04311ab136/html5/thumbnails/6.jpg)
わんくま同盟東京勉強会 #33
BackGroundWorker
System.ComponentModel.BackgroundWorker
処理中にユーザー インターフェイスが応答しなくなることを防ぐために、処理を別スレッドで実行できる
<Demo>
![Page 7: R流・C#マルチスレッドの復讐BackGroundWorker System.ComponentModel.BackgroundWorker 処理中にユーザーインターフェイスが応答しな くなることを防ぐために、処理を別スレッドで実](https://reader036.vdocuments.pub/reader036/viewer/2022070923/5fbbe599b48b0c04311ab136/html5/thumbnails/7.jpg)
わんくま同盟東京勉強会 #33
Thread
System.Threading.Thread
最も、基本的な方法。優先度の設定などの細かい制御ができる。
<Demo>
![Page 8: R流・C#マルチスレッドの復讐BackGroundWorker System.ComponentModel.BackgroundWorker 処理中にユーザーインターフェイスが応答しな くなることを防ぐために、処理を別スレッドで実](https://reader036.vdocuments.pub/reader036/viewer/2022070923/5fbbe599b48b0c04311ab136/html5/thumbnails/8.jpg)
わんくま同盟東京勉強会 #33
ThreadPool
System.Threading.ThreadPool
スレッド数を制御したり、スレッドリソースを再利用することで、パフォーマンスの良いマルチスレッドの処理ができる。
スレッドメソッドの引数を1つ取ることが可能。
<Demo>
![Page 9: R流・C#マルチスレッドの復讐BackGroundWorker System.ComponentModel.BackgroundWorker 処理中にユーザーインターフェイスが応答しな くなることを防ぐために、処理を別スレッドで実](https://reader036.vdocuments.pub/reader036/viewer/2022070923/5fbbe599b48b0c04311ab136/html5/thumbnails/9.jpg)
わんくま同盟東京勉強会 #33
Timer
System.Threading.Timer
一定間隔でスレッドを作成して処理を実行させることができる。
<Demo>
![Page 10: R流・C#マルチスレッドの復讐BackGroundWorker System.ComponentModel.BackgroundWorker 処理中にユーザーインターフェイスが応答しな くなることを防ぐために、処理を別スレッドで実](https://reader036.vdocuments.pub/reader036/viewer/2022070923/5fbbe599b48b0c04311ab136/html5/thumbnails/10.jpg)
わんくま同盟東京勉強会 #33
Delegate
スレッドプールを自動的に使用してメソッドを実行する。
戻り値の取得や、引数を複数使用できる。また、例外処理や終了処理の待機も可能。
<Demo>
![Page 11: R流・C#マルチスレッドの復讐BackGroundWorker System.ComponentModel.BackgroundWorker 処理中にユーザーインターフェイスが応答しな くなることを防ぐために、処理を別スレッドで実](https://reader036.vdocuments.pub/reader036/viewer/2022070923/5fbbe599b48b0c04311ab136/html5/thumbnails/11.jpg)
わんくま同盟東京勉強会 #33
はまりどころ
•変数に格納される値が常時変化してしまう問題~排他制御(Lock)
•最適化によって必要な処理が省かれてしまう問題~最適化防止(volatile)
•非同期であるが故の問題• 終わらなくても次の処理が動作してしまう• 実行される順序がバラバラ
![Page 12: R流・C#マルチスレッドの復讐BackGroundWorker System.ComponentModel.BackgroundWorker 処理中にユーザーインターフェイスが応答しな くなることを防ぐために、処理を別スレッドで実](https://reader036.vdocuments.pub/reader036/viewer/2022070923/5fbbe599b48b0c04311ab136/html5/thumbnails/12.jpg)
わんくま同盟東京勉強会 #33
C#4.0 - Task
using System.Threading.Tasks;:Task t0 = Task.StartNew(() => 重い処理(0));Task t1 = Task.StartNew(() => 重い処理(1));
![Page 13: R流・C#マルチスレッドの復讐BackGroundWorker System.ComponentModel.BackgroundWorker 処理中にユーザーインターフェイスが応答しな くなることを防ぐために、処理を別スレッドで実](https://reader036.vdocuments.pub/reader036/viewer/2022070923/5fbbe599b48b0c04311ab136/html5/thumbnails/13.jpg)
わんくま同盟東京勉強会 #33
C#4.0 – for
通常for (int i = 0; i < 10; ++i) {
重たい処理(i);}
並列Parallel.For(0, 10, i => {
重たい処理(i)});
<Demo>
![Page 14: R流・C#マルチスレッドの復讐BackGroundWorker System.ComponentModel.BackgroundWorker 処理中にユーザーインターフェイスが応答しな くなることを防ぐために、処理を別スレッドで実](https://reader036.vdocuments.pub/reader036/viewer/2022070923/5fbbe599b48b0c04311ab136/html5/thumbnails/14.jpg)
わんくま同盟東京勉強会 #33
C#4.0 – foreach
通常foreach(var x in collection) {
重たい処理(x);}
並列Parallel.Foreach(collection, x => {
重たい処理(x)});
<Demo>
![Page 15: R流・C#マルチスレッドの復讐BackGroundWorker System.ComponentModel.BackgroundWorker 処理中にユーザーインターフェイスが応答しな くなることを防ぐために、処理を別スレッドで実](https://reader036.vdocuments.pub/reader036/viewer/2022070923/5fbbe599b48b0c04311ab136/html5/thumbnails/15.jpg)
わんくま同盟東京勉強会 #33
C#4.0 – LINQ
通常var q =
from x in collection select x;
並列var q =
from x in collection.AsParallel() select x;
<Demo>
![Page 16: R流・C#マルチスレッドの復讐BackGroundWorker System.ComponentModel.BackgroundWorker 処理中にユーザーインターフェイスが応答しな くなることを防ぐために、処理を別スレッドで実](https://reader036.vdocuments.pub/reader036/viewer/2022070923/5fbbe599b48b0c04311ab136/html5/thumbnails/16.jpg)
わんくま同盟東京勉強会 #33
まとめ
•記述は簡単になって使いやすくなります
•でも、はまり所は今までと同じです
•処理の内容を理解して用法用量をまもって
正しく使いましょう
![Page 17: R流・C#マルチスレッドの復讐BackGroundWorker System.ComponentModel.BackgroundWorker 処理中にユーザーインターフェイスが応答しな くなることを防ぐために、処理を別スレッドで実](https://reader036.vdocuments.pub/reader036/viewer/2022070923/5fbbe599b48b0c04311ab136/html5/thumbnails/17.jpg)
わんくま同盟東京勉強会 #33
ご清聴ありがとうございました!
Microsoft MVP for Development Tools - Visual C# (April 2007 - March 2010)
Microsoft Certified Professional Developer
- Windows Developer
Microsoft Certified Technology Specialist
- .Net Framework 2.0: Windows Applications
2009年05月16日
R・田中一郎
http://blogs.wankuma.com/rti/