C#における非同期とマルチスレッドの違い
C#の非同期とマルチスレッドの違いは何ですか?非同期およびマルチスレッドの両方は、呼び出しスレッドのブロックを回避する目的を達成し、ソフトウェアの応答性を向上させることができる.非同期とマルチスレッドが同等の概念であると考える場合もある.しかし、非同期とマルチスレッドにはいくつかの違いがあります.これらの違いは、非同期とマルチスレッドを使用するタイミングの違いをもたらします.
非同期とマルチスレッドの違いの非同期操作の本質
すべてのプログラムは最終的にコンピュータハードウェアによって実行されるので、非同期操作の本質をよりよく理解するために、ハードウェアの基礎を理解する必要があります.コンピュータのハードウエアを熟知している友达はきっとDMAという言叶に対してよく知らないで、ハードディスク、オプティカルドライブの技术の规格の中ですべてDMAのモードの指标が明确で、実はネットカード、サウンドカード、グラフィックスカードもDMAの机能があります.DMAとは、直接メモリアクセスという意味であり、DMA機能を持つハードウェアは、メモリとのデータ交換時にCPUリソースを消費しなくてもよい.CPUがデータ転送を開始するときにコマンドを送信すると、ハードウェアは自己とメモリのデータ交換を開始し、転送が完了するとハードウェアは割り込みをトリガーして操作の完了を通知します.これらCPU時間を消費しないI/O動作は非同期動作のハードウェア基盤である.したがって、DOSのような単一プロセス(かつスレッド概念なし)システムにおいても、同様に非同期DMA動作を開始することができる.
非同期とマルチスレッドの違いのスレッドの本質
スレッドはコンピュータハードウェアの機能ではなく、オペレーティングシステムが提供する論理機能であり、スレッドは本質的にプロセス中に同時実行されるコードであるため、スレッドはオペレーティングシステムがCPUリソースを投入して実行し、スケジューリングする必要がある.
非同期とマルチスレッドの違いの非同期操作のメリットとデメリット
非同期操作は、追加のスレッド負担を必要とせず、コールバック方式で処理されるため、設計が良好な場合、処理関数は共有変数を使用する必要がなく(完全に使用できなくても、少なくとも共有変数の数を減らすことができる)、デッドロックの可能性を低減することができる.もちろん非同期操作も完璧ではありません.非同期操作の作成の複雑さは比較的高く、プログラムは主にコールバック方式で処理され、普通の人の考え方とは少し初心者で、デバッグが難しい.
非同期とマルチスレッドの違いのマルチスレッドの長所と短所
マルチスレッドの利点は明らかで、スレッドの中の処理プログラムは依然として順番に実行され、普通の人の思考習慣に合っているので、プログラミングは簡単です.しかし、マルチスレッドの欠点も同様に明らかであり、スレッドの使用(乱用)はシステムにコンテキスト切替の余分な負担をもたらす.また、スレッド間の共有変数は、デッドロックの発生をもたらす可能性があります.
適用範囲
スレッドと非同期操作のそれぞれの長所と短所を理解した後,スレッドと非同期の合理的な用途を検討することができる.I/O操作が必要な場合、スレッド+同期I/O操作より非同期操作の方が適切だと思います.I/O操作には、直接ファイル、ネットワークの読み書きだけでなく、データベース操作、Web Service、HttpRequest、.net Remotingなどのプロセス間呼び出しも含まれます.
スレッドの適用範囲は,長いCPU演算が必要な場合,例えば,長い時間を要するグラフィック処理やアルゴリズム実行である.しかし、スレッドを使用してプログラミングするのは簡単で習慣に合っているため、多くの友达はスレッドを使用して時間のかかるI/O操作を実行することが多い.このように少数の同時操作のみの場合には特に問題なく,大量の同時操作を処理する必要がある場合には不適切である.
非同期とマルチスレッドの区別例の研究
理論的なことを言うと、とっくにうんざりしている兄弟もいるかもしれませんが、実際の非同期操作の例をいくつか検討しましょう.
非同期とマルチスレッドの違いの例:delegateによって生成された非同期方法はいったいどういうことですか.
delegateを使用すると、非同期呼び出しを行う方法を「自動」にすることができることはよく知られているかもしれません.直感的には,コンパイラやCLRが別のスレッドを用いてターゲットメソッドを実行していると思う.果たしてそうなのか.コードで証明しましょう.
view source print ?
01
using
System;
02
using
System.Threading;
03
namespace
AsyncDelegateDemo
04
{
05
delegate
void
AsyncFoo(
int
i);
06
class
Program
07
{
08
/// ﹤summary﹥
09
///
10
/// ﹤/summary﹥
11
/// ﹤param name="name"﹥ ﹤/param﹥
12
static
void
PrintCurrThreadInfo(
string
name)
13
{
14
Console.WriteLine(
"Thread Id of "
+ name +
" is: "
+ Thread.CurrentThread.ManagedThreadId +
", current thread is "
15
+ (Thread.CurrentThread.IsThreadPoolThread ?
""
:
"not "
) +
"thread pool thread."
);
16
}
17
18
19
/// ﹤summary﹥
20
/// ,Sleep
21
/// ﹤/summary﹥
22
/// ﹤param name="i"﹥Sleep ﹤/param﹥
23
static
void
Foo(
int
i)
24
{
25
PrintCurrThreadInfo(
"Foo()"
);
26
Thread.Sleep(i);
27
}
28
29
30
/// ﹤summary﹥
31
///
32
/// ﹤/summary﹥
33
static
void
PostAsync()
34
{
35
AsyncFoo caller =
new
AsyncFoo(Foo);
36
caller.BeginInvoke(1000,
new
AsyncCallback(FooCallBack), caller);
37
}
38
39
40
static
void
Main(
string
[] args)
41
{
42
PrintCurrThreadInfo(
"Main()"
);
43
for
(
int
i = 0; i < 100; i++)
44
{
45
PostAsync();
46
}
47
Console.ReadLine();
48
}
49
50
51
static
void
FooCallBack(IAsyncResult ar)
52
{
53
PrintCurrThreadInfo(
"FooCallBack()"
);
54
AsyncFoo caller = (AsyncFoo)ar.AsyncState;
55
caller.EndInvoke(ar);
56
}
57
}
58
}
とマルチスレッドの インスタンスコードの は のとおりです.
Thread Id of Main() is: 1,
current thread is not thread pool thread.
Thread Id of Foo() is: 3,
current thread is thread pool thread.
Thread Id of FooCallBack() is: 3,
current thread is thread pool thread.
Thread Id of Foo() is: 3,
current thread is thread pool thread.
Thread Id of Foo() is: 4,
current thread is thread pool thread.
Thread Id of Foo() is: 5,
current thread is thread pool thread.
Thread Id of FooCallBack() is: 3,
current thread is thread pool thread.
Thread Id of Foo() is: 3,