teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

5

追記

2017/07/11 04:53

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -18,4 +18,38 @@
18
18
 
19
19
  TaskはThreadをより高水準化した再実装なのです。
20
20
  よりネイティブな方が早そうじゃん、って言われても、測って、とか、突き詰めればそれはそうでしょうね、としか言えません。
21
- 正に、C++とC#の違いですよ。Threadと、Taskっていうのは。
21
+ 正に、C++とC#の違いですよ。Threadと、Taskっていうのは。
22
+
23
+ #追記
24
+
25
+ 再実装という言い回しには誤りがあったので訂正します。
26
+ ソースを提示するのが一番適切な回答であると判断に至り、追記させて頂きます。
27
+
28
+ Task自身は実行に関するロジックを持っておらず、該当箇所はThreadPoolTaskScheduler内にあります。
29
+ Taskの実行にあたりTaskScheduler.Currentが呼び出されます。
30
+ ThreadPoolTaskSchedulerはTaskSchedulerクラスのデフォルト実装です。
31
+
32
+ https://referencesource.microsoft.com/#mscorlib/system/threading/Tasks/ThreadPoolTaskScheduler.cs
33
+
34
+ 最終的にはLongRunningのオプションの有無によってThreadか、ThreadPoolにTaskを振り分ける実装であり、動作速度自体はラップの有無程度になると思います。
35
+ 実行ソースはシンプルなので、ThreadとTaskの距離感も分かりやすいのではないでしょうか。
36
+ ```C#
37
+ protected internal override void QueueTask(Task task)
38
+ {
39
+ if ((task.Options & TaskCreationOptions.LongRunning) != 0)
40
+ {
41
+ // Run LongRunning tasks on their own dedicated thread.
42
+ Thread thread = new Thread(s_longRunningThreadWork);
43
+ thread.IsBackground = true; // Keep this thread from blocking process shutdown
44
+ thread.Start(task);
45
+ }
46
+ else
47
+ {
48
+ // Normal handling for non-LongRunning tasks.
49
+ bool forceToGlobalQueue = ((task.Options & TaskCreationOptions.PreferFairness) != 0);
50
+ ThreadPool.UnsafeQueueCustomWorkItem(task, forceToGlobalQueue);
51
+ }
52
+ }
53
+ ```
54
+
55
+ Threadクラス自体の細かい情報が必要で、自身による拡張の特殊性がMS製のTaskを上回るならThreadを使う判断は有りだ、と考えてよいと思います。

4

余分な単語の削除

2017/07/11 04:53

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -14,7 +14,7 @@
14
14
  C#は最新技術を搭載しようぜ!でも使う方はよくわかんなくてもいいようにしたいね、みたいな風変りな圧力が掛かった言語だと思います。
15
15
  そういったフランクさがC#の良いところだと思います。
16
16
  殆どの言語が新しい概念をデフォルトで使えるように進化しているので、それは時流といえば時流ですし、
17
- 反面古いコードはどんどんobsoleteになってしまったり新しい概念と衝突したりといった問題も抱えているので、良いところばかりとは言えないんでしょうけどね。
17
+ 古いコードはどんどんobsoleteになってしまったり新しい概念と衝突したりといった問題も抱えているので、良いところばかりとは言えないんでしょうけどね。
18
18
 
19
19
  TaskはThreadをより高水準化した再実装なのです。
20
20
  よりネイティブな方が早そうじゃん、って言われても、測って、とか、突き詰めればそれはそうでしょうね、としか言えません。

3

誤字の修正

2017/07/05 04:45

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -13,7 +13,7 @@
13
13
 
14
14
  C#は最新技術を搭載しようぜ!でも使う方はよくわかんなくてもいいようにしたいね、みたいな風変りな圧力が掛かった言語だと思います。
15
15
  そういったフランクさがC#の良いところだと思います。
16
- 殆どの言語が新しい概念をデフォルトで使えるように進化しているので、それ時流といえば時流ですし、
16
+ 殆どの言語が新しい概念をデフォルトで使えるように進化しているので、それ時流といえば時流ですし、
17
17
  反面古いコードはどんどんobsoleteになってしまったり新しい概念と衝突したりといった問題も抱えているので、良いところばかりとは言えないんでしょうけどね。
18
18
 
19
19
  TaskはThreadをより高水準化した再実装なのです。

2

誤字の修正

2017/07/05 04:30

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -14,7 +14,7 @@
14
14
  C#は最新技術を搭載しようぜ!でも使う方はよくわかんなくてもいいようにしたいね、みたいな風変りな圧力が掛かった言語だと思います。
15
15
  そういったフランクさがC#の良いところだと思います。
16
16
  殆どの言語が新しい概念をデフォルトで使えるように進化しているので、それも時流といえば時流ですし、
17
- 反面古いコードはどんどんobsoleteになってしまったり新しい概念と衝突したりといった問題も抱えていますし、良いところばかりとは言えないんでしょうけどね。
17
+ 反面古いコードはどんどんobsoleteになってしまったり新しい概念と衝突したりといった問題も抱えているので、良いところばかりとは言えないんでしょうけどね。
18
18
 
19
19
  TaskはThreadをより高水準化した再実装なのです。
20
20
  よりネイティブな方が早そうじゃん、って言われても、測って、とか、突き詰めればそれはそうでしょうね、としか言えません。

1

余分な単語の削除

2017/07/05 04:29

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -1,7 +1,7 @@
1
1
  Taskの目的は性能向上ではなく利便性の向上です。
2
2
 
3
3
  ThreadPoolがあれば改善するのは速度ではなく、「スレッドの上限を超えてしまう問題」や「スレッド数を制限する」とかそうした煩雑さとの決別にあります。
4
- 非同期プロシージャコールのフックなんかを考えるより、Taskとして積み上げてしまった方が簡単です。
4
+ 非同期プロシージャコールを考えるより、Taskとして積み上げてしまった方が簡単です。
5
5
  async-awaitプログラミングには必要不可欠だったし、わずか10行のコードを書いてサブスレッドで実行させるなんてのに毎回難しいことはしたくない。
6
6
  IOバウンドな非同期タスクの実装の簡易化はThreadからの進化の最良の例といえるでしょう。
7
7
  Threadインスタンスを直接保持しないというのも利点です。