C#の異常な同期動作

1.非同期とは何ですか?

典型的には、非同期操作を実行するために使用されるリモート・コンピュータまたはデータベースクエリに接続され、このような大きなファイルを開くなどのタスクを、完了するまでに時間がかかることがあり=非同期動作は、アプリケーションのメインスレッド以外のスレッドで行います。アプリケーションが非同期操作を実行するメソッドを呼び出すと、アプリケーションは、非同期方式で実行し続けることができ、そのタスクを実行します。

2、同期と非同期との間の差

同期(同期):操作の実行中に、アプリケーションは、実行が完了した後も継続して操作を待つ必要があります。

非同期(非同期):操作の実行中に、アプリケーションが非同期操作が行われたときに実行し続けることができます。エッセンス:非同期、新しいスレッド、メインスレッドとスレッド並列実行方法を開始します。

3差、非同期およびマルチスレッド

我々はすでに非同期およびマルチスレッドは対等な関係ではない、知っている、究極の目標は、私たちの非同期を達成するために、非同期、マルチスレッドだけの手段です。呼び出しは、呼び出し元に戻るには、非同期要求であるが、その結果を待たずに、発信者や他のことを行うことができたとき。非同期マルチスレッド技術を使用することができるか、または別のプロセスが処理されるべきです。

簡単に言えば:スレッドプールからの非同期スレッドが管理を担当し、マルチスレッド、私たちは自分自身を制御することができ、もちろん、マルチスレッドでは、我々はまた、スレッドプールを使用することができます。

あなたが達成するために非同期モードを使用する場合、ネットワークワームのグリル用語を取り、それがスレッドプール管理を使用しています。非同期操作が行われた場合、操作が完了するために、スレッドプールのスレッド投げ動作します。ときに開始I / O操作、非同期の仕事は、どのCPUリソースaを取る作業がページを取得しないことを意味しますスレッドプールのスレッドに返されます。Webページを取得し、非同期の完了が完了するまでは、非同期コールバックは途中でスレッドプールに気づくでしょう。スレッドプールによって、目に見える、非同期モードでは、大幅にCPUリソースを節約します。

注:DMA(ダイレクトメモリアクセス)ダイレクトメモリアクセスを、名前がDMA機能を示唆しているように、直接メモリからデータを読み出すことができるプロセッサをバイパスするデバイスを可能にすることです。データ交換を通じてダイレクトメモリアクセスは、CPUリソースのほとんど損失はありません。ハードウェアでは、ハードドライブ、ネットワークカード、サウンドカード、ビデオカードなどは、ダイレクトメモリアクセス機能を持っています。非同期プログラミングモデルは、私たちは完全にCPUの圧力を解放するためにハードウェアのダイレクト・メモリ・アクセス機能を利用できるようにすることです。

2つのシナリオ:

  • 計算集約型の仕事、マルチスレッドを使用します。

  • IO集約型の仕事、非同期メカニズムの使用。

C#コード基準非同期(非同期と待ちます)

using System;
using System.Threading;
using System.Threading.Tasks;

namespace AsyncAwaitDemo { class Program { static void Main(string[] args) { Console.WriteLine("main start.."); AsyncMethod(); Thread.Sleep(1000); Console.WriteLine("main end.."); Console.ReadLine(); } static async void AsyncMethod() { Console.WriteLine("start async"); var result = await MyMethod(); Console.WriteLine("end async"); //return 1; } static async Task<int> MyMethod() { for (int i = 0; i < 5; i++) { Console.WriteLine("Async start:" + i.ToString() + ".."); await Task.Delay(1000); //模拟耗时操作 } return 0; } } }

(待ちを使用)と非同期実行方法を同期させるためGetAwaiter()。のgetResult()メソッド

using System;
using System.Threading.Tasks;

namespace AsyncTest
{
    class Program { static void Main(string[] args) { Console.WriteLine("Async Test job:"); Console.WriteLine("main start.."); Console.WriteLine("MyMethod()异步方法同步执行:"); MyMethod().Wait();//在main中等待async方法执行完成 int i = MyMethod().GetAwaiter().GetResult();//用于在main中同步获取async方法的返回结果 Console.WriteLine("i:" + i); Console.WriteLine("main end.."); Console.ReadKey(true); } static async Task<int> MyMethod() { for (int i = 0; i < 5; i++) { Console.WriteLine("Async start:" + i.ToString() + ".."); await Task.Delay(1000); //模拟耗时操作 } return 0; } } }

おすすめ

転載: www.cnblogs.com/feelSku/p/10945793.html