タグ付けされた質問 「async」

5
C#でのasync / awaitの使用のガイドラインは、優れたアーキテクチャと抽象化レイヤーの概念と矛盾していませんか?
この質問はC#言語に関するものですが、JavaやTypeScriptなどの他の言語をカバーするものと期待しています。 Microsoft は、.NETで非同期呼び出しを使用する場合のベストプラクティスを推奨しています。これらの推奨事項のうち、2つを選択しましょう。 TaskまたはTask <>を返すように非同期メソッドのシグネチャを変更します(TypeScriptでは、Promise <>になります) 非同期メソッドの名前をxxxAsync()で終わるように変更します 現在、低レベルの同期コンポーネントを非同期コンポーネントに置き換えると、これはアプリケーションのフルスタックに影響します。async / awaitは「最後まで」使用した場合にのみプラスの影響を与えるため、アプリケーション内のすべてのレイヤーのシグネチャとメソッド名を変更する必要があることを意味します。 優れたアーキテクチャでは、各レイヤーの間に抽象化を配置することが多く、低レベルのコンポーネントを他のコンポーネントに置き換えることは、上位レベルのコンポーネントには見えません。C#では、抽象化はインターフェイスの形式を取ります。新しい低レベルの非同期コンポーネントを導入する場合、コールスタック内の各インターフェイスを変更するか、新しいインターフェイスに置き換える必要があります。実装クラスで問題が解決される方法(非同期または同期)は、呼び出し元には隠されません(抽象化されません)。呼び出し元は、同期か非同期かを知る必要があります。 「良いアーキテクチャ」の原則と矛盾するベストプラクティスを非同期/待機しませんか? 非同期依存関係に切り替えるときにスタック内で置き換えることができるように、各インターフェイス(IEnumerable、IDataAccessLayerなど)が非同期の対応物(IAsyncEnumerable、IAsyncDataAccessLayer)を必要とするということですか? 問題をもう少し進めると、すべてのメソッドが非同期(Task <>またはPromise <>を返す)であると仮定し、メソッドが実際に非同期呼び出しを同期しないようにする方が簡単ではないでしょうか非同期?これは将来のプログラミング言語から期待されるものですか?
103 c#  architecture  async 

5
関数型言語での非同期プログラミング
私はほとんどC / C ++プログラマーです。つまり、私の経験の大部分は手続き型およびオブジェクト指向のパラダイムに関するものです。ただし、多くのC ++プログラマーが認識しているように、C ++は長年にわたって機能的なスタイルに重点を移しており、最終的にC ++ 0xにラムダとクロージャーが追加されました。 とにかく、C ++を使用した関数型スタイルでのコーディングの経験はかなりありますが、LispやHaskellなどの実際の関数型言語の経験はほとんどありません。 私は最近、これらの言語の研究を始めました。なぜなら、特に並行性と分散コンピューティングへの応用に関して、純粋に機能的な言語の「副作用なし」という考えが常に興味をそそっていました。 ただし、C ++のバックグラウンドから来ると、この「副作用なし」の哲学が非同期プログラミングでどのように機能するかについて混乱しています。非同期プログラミングとは、ユーザーが提供するイベントハンドラーをディスパッチして、非同期に発生するイベントを処理するフレームワーク/ API /コーディングスタイルを意味します(プログラムのフロー外)。これには、Boost.ASIOなどの非同期ライブラリ、または単なる古いCさえ含まれます。シグナルハンドラまたはJava GUIイベントハンドラ。 これらすべてに共通することの1つは、非同期イベントハンドラーが呼び出されたことをプログラムのメインフローが認識するために、非同期プログラミングの性質が副作用(状態)の作成を必要とするように見えることです。通常、Boost.ASIOのようなフレームワークでは、イベントハンドラーはオブジェクトの状態を変更するため、イベントの効果はイベントハンドラー関数の有効期間を超えて伝播されます。本当に、イベントハンドラは他に何ができますか?コールポイントがないため、コールポイントに値を「返す」ことはできません。イベントハンドラはプログラムのメインフローの一部ではないため、実際のプログラムに影響を与える唯一の方法は、状態を変更することです(またはlongjmp、別の実行ポイントに変更することです)。 そのため、非同期プログラミングは、副作用を非同期的に生成することがすべてのようです。これは、関数型プログラミングの目標と完全に矛盾しているようです。これら2つのパラダイムは、関数型言語でどのように(実際に)調整されますか?

4
どのJavascript関数がブロックと非ブロックを決定するのですか?
数年前からWebベースのJavascript(バニラJS、jQuery、Backboneなど)をやっていて、最近Node.jsでいくつかの仕事をしています。「ノンブロッキング」プログラミングのコツをつかむにはしばらく時間がかかりましたが、今ではIO操作などにコールバックを使用することに慣れています。 Javascriptは本質的にシングルスレッドであることを理解しています。Nodeの「イベントキュー」の概念を理解しています。私が理解できないのは、個々のjavascript操作が「ブロッキング」か「ノンブロッキング」かを決定するものです。後のコードで使用するために出力を同期的に生成するために依存できる操作、および最初の操作が完了した後に出力を処理できるようにコールバックを渡す必要がある操作を確認するにはどうすればよいですか?非同期/非ブロッキングのJavascript関数のリストと、同期/ブロッキングの関数のリストはありますか?Javascriptアプリが1つの巨大な競合状態になるのを妨げているのは何ですか? NodeでのIO操作やWebでのAJAX操作など、時間がかかる操作は非同期である必要があるため、コールバックを使用することを知っていますが、「長時間」と見なされるものを決定しているのは誰ですか?これらの操作には、通常の「イベントキュー」からそれらを削除する何らかのトリガーがありますか?そうでない場合、変数への値の割り当てや配列のループなどの単純な操作と、それらを同期方式で終了することに依存できると思われるものとは何が違うのでしょうか? おそらく、私はこれを正しく考えさえしていないでしょう。ありがとう!

6
なぜメソッドを「待ち」、すぐにその戻り値を調べるのでしょうか?
で、このMSDNの記事、次のコード例は、(わずかに簡潔にするために編集された)が設けられています。 public async Task<ActionResult> Details(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } Department department = await db.Departments.FindAsync(id); if (department == null) { return HttpNotFound(); } return View(department); } このFindAsyncメソッドは、DepartmentIDでオブジェクトを取得し、を返しますTask<Department>。次に、部門がすぐにチェックされ、nullかどうかが確認されます。私が理解しているように、この方法でタスクの値を要求すると、待機中のメソッドから値が返されるまでコード実行がブロックされ、事実上これが同期呼び出しになります。 なぜこれをするのですか?Find(id)とにかくすぐにブロックする場合は、単に同期メソッドを呼び出す方が簡単ではありませんか?
24 c#  .net  asp.net-mvc  async 

3
非同期/待機デッドロックを診断するにはどうすればよいですか?
私はasync / awaitを多用する新しいコードベースで作業しています。私のチームのほとんどの人は、async / awaitにかなり慣れていません。私たちは一般的にMicrosoftによって指定されたベストプラクティスを保持する傾向がありますが、一般的には非同期呼び出しを通過するためにコンテキストが必要で、そうでないライブラリを使用していConfigureAwait(false)ます。 それらすべてを組み合わせて、毎週記事で説明されている非同期デッドロックに遭遇します。模擬テストされたデータソース(通常はを介してTask.FromResult)はデッドロックをトリガーするのに十分ではないため、ユニットテスト中には表示されません。そのため、実行時または統合テスト中に、一部のサービスコールは昼食に出て戻りません。それはサーバーを殺し、一般的に混乱をもたらします。 問題は、間違いがどこで発生したかを追跡すること(通常は完全に非同期ではないこと)には、通常、手作業のコード検査が含まれ、時間がかかり、自動化できないことです。 デッドロックの原因を診断するより良い方法は何ですか?
24 c#  debugging  async 

5
どの時点でディスクI / Oの非同期読み取りが同期より効率的ですか?
複数のコンシューマー向けにファイルを読み取るコードが少しあり、ファイルのサイズは任意であると仮定します。ファイルを非同期で読み取る方がどのサイズで効率がよくなりますか?別の言い方をすれば、同期的に読み取るためだけにファイルを高速化するには、ファイルをどれだけ小さくする必要がありますか? 私は、非常に小さなファイルを読み取るとき、同期(特に.NET)よりも非同期で読み取るのに時間がかかることに気付きました(そしておそらく私は間違っています)。これは、I / O完了ポート、スレッドなどのセットアップ時間に関係していると思います。 ここに役立つ経験則はありますか?それとも、システムと環境に依存していますか?
22 efficiency  async  io 

2
誰が最初に非同期/待機しましたか?
Pythonは、2015年に3.5でasync / awaitコンストラクトを追加しました。Javascriptコミュニティは、数千年にわたってそれに向かって一歩を踏み出し、最終的に2017年にリリースされたES8のドラフトに非常によく似た実装を追加しました(私の理解から)。Typescriptは、2015年にバージョン1.7の非同期メソッドを追加しました。これは、訓練されていない目にはjs非同期メソッドとまったく同じように見えます。 C#2012年にasync / awaitの他のすべての実装のように見える非同期メソッドを追加し、2010年にF#2.0で導入されたF#の同様に動作するが外観の異なる非同期ワークフローに基づいていました。 -非同期/待機ペアを持つC#および非同期フローを持つF#。 言語コンストラクト(またはライブラリ)としてこのコンテキストで使用されているキーワードの以前の例はありますか?私の限られた情報から、誰もがC#実装の良い部分を模倣したように見えますが、C#は他の誰かからそれをコピーしましたか?

3
複数の非同期サービスを並行して呼び出す
互いに依存しない非同期RESTサービスはほとんどありません。それは、Service1からの応答を「待っている」間で、Service2、Service3などを呼び出すことができます。 たとえば、以下のコードを参照してください。 var service1Response = await HttpService1Async(); var service2Response = await HttpService2Async(); // Use service1Response and service2Response 現在、にservice2Response依存せず、service1Response独立して取得できます。したがって、最初のサービスの応答を待って2番目のサービスを呼び出す必要はありません。 Parallel.ForEachCPUバウンド操作ではないため、ここで使用できるとは思わない。 これらの2つの操作を並行して呼び出すために、useを呼び出すことができますTask.WhenAllか?私が使用してTask.WhenAllいる問題の1つは、結果を返さないことです。結果を取得するには、を呼び出したtask.Result後に呼び出すことができます。Task.WhenAllすべてのタスクが既に完了しており、応答を取得する必要があるためです。 サンプルコード: var task1 = HttpService1Async(); var task2 = HttpService2Async(); await Task.WhenAll(task1, task2) var result1 = task1.Result; var result2 = task2.Result; // Use result1 and result2 このコードは、パフォーマンスの面で最初のコードよりも優れていますか?私が使用できる他のアプローチはありますか?

2
なぜC#でオーバーライドを非同期にできるのですか?
C#では、メソッドをオーバーライドするときに、元のメソッドがオーバーライドしていなかった場合にオーバーライドを非同期にすることが許可されています。これは貧弱な形のようです。 私にこれをもたらした例はこれでした-私は、負荷テストの問題を支援するために連れてこられました。同時ユーザー数が約500の場合、ログインプロセスはリダイレクトループになります。IISは、「非同期操作がまだ保留中に非同期モジュールまたはハンドラーが完了しました」というメッセージで例外を記録していました。一部の検索では、誰かが悪用していると思うようになりましたがasync void、ソースをすばやく検索しても何も見つかりませんでした。 悲しいことに、「async \ s [^ T]」のようなものを探すべきだったときに、「async \ svoid」(正規表現検索)を探していました(タスクが完全に修飾されていないと仮定すると...ポイントが得られます)。 後で見つけたのasync override void onActionExecuting(...は、ベースコントローラーです。明らかにそれが問題にならなければなりませんでした。これを修正することで(現時点では同期化することで)問題は解決しました。 質問に戻る:なぜ、呼び出し元のコードがそれを待つことができないのに、なぜオーバーライドを非同期としてマークできるのでしょうか?
16 c#  async 

3
BackgroundWorkerとAsync / Await
私はC#開発の初心者であり、より応答性の高いUIを作成したいと考えています。私の予備調査では、これを達成するための2つの方法を見てきました。 BackgroundWorkerクラスと組み合わせたマルチスレッド。 新しいAsync / Await修飾子。 新しい方が良いという意味ですか?2つの方法の違いは何ですか?新しいプロジェクトを作成したい場合、どの方法を選択するのですか? 編集:たぶん指定する必要があります。Windows Formsアプリケーションを作成しています。ここでは、必要なすべてのデータがローカルディスクに保存/ロードされます。また、いくつかのUSBデバイスと通信します。

6
C#5非同期再入可能性のソリューション
そのため、C#5の新しい非同期サポートについて何かが私を悩ませています。 ユーザーは、非同期操作を開始するボタンを押します。呼び出しはすぐに戻り、メッセージポンプが再び実行を開始します-それがポイントです。 そのため、ユーザーはボタンを再度押すことができます-再入を引き起こします。これが問題になったらどうしますか? 私が見たデモでは、await呼び出しの前にボタンを無効にし、その後再び有効にします。これは、実際のアプリでは非常に脆弱なソリューションのように思えます。 特定の実行中の操作に対してどのコントロールを無効にする必要があるかを指定するある種のステートマシンをコーディングする必要がありますか?または、より良い方法がありますか? 操作中はモーダルダイアログを表示したいだけですが、これはまるでハンマーを使用しているように感じます。 誰もが明るいアイデアを持っていますか? 編集: 操作の実行中に使用すべきでないコントロールを無効にすると、多くのコントロールを持つウィンドウがあるとすぐに複雑になると思うので、壊れやすいと思います。最初のコーディングとその後のメンテナンスの両方で、バグの可能性を減らすため、物事をシンプルに保つことが好きです。 特定の操作に対して無効にする必要があるコントロールのコレクションがある場合はどうなりますか?また、複数の操作が同時に実行されている場合はどうなりますか?

3
C#5非同期サポートはUIスレッドの同期の問題をどのように支援しますか?
どこかで、C#5 async-awaitは非常に素晴らしいので、これを行うことを心配する必要はないと聞いた: if (InvokeRequired) { BeginInvoke(...); return; } // do your stuff here 待機操作のコールバックは、呼び出し元の元のスレッドで発生するようです。Eric LippertとAnders Hejlsbergは、この機能がUI(特にタッチデバイスUI)の応答性を高める必要性に起因すると何度か述べています。 このような機能の一般的な使用法は次のようになると思います。 public class Form1 : Form { // ... async void GetFurtherInfo() { var temperature = await GetCurrentTemperatureAsync(); label1.Text = temperature; } } コールバックのみが使用される場合、ラベルテキストを設定すると、UIのスレッドで実行されないため、例外が発生します。 これまでのところ、これが事実であることを確認するリソースが見つかりませんでした。誰もこれについて知っていますか?これがどのように機能するかを技術的に説明するドキュメントはありますか? 「はい」と答えるだけでなく、信頼できるソースからのリンクを提供してください。

1
NodeJSはどのようにして「ノンブロッキング」にできますか?
私はNodeJSを学んでおり、何かを明確にしたかっただけです。これまでのいくつかの入門チュートリアルと本では、非常に早い段階でNodeの「ノンブロッキング」アーキテクチャについて説明しました。 したがって、たとえば、この例は、データベースからデータを取得する非同期的な方法を読んでいる本で提供されました。 http.createServer(function (req, res) { database.getInformation(function (data) { res.writeHead(200); res.end(data); }); }); (私が理解しているように)起こることは、Nodeがデータベースへの呼び出しを行い、次に呼び出しスタックの次のものを処理し続けることです。データベースリクエストが完了すると、匿名コールバック関数のデータ変数が設定され、その関数がコールスタックに追加されます(その後、ノードがそれに到達したときに実行されます)。 私の質問は、データベース要求を正確に処理しているのは何ですか?確かにNodeはブロックしなければなりませんか?データベース要求を処理しているのは何ですか?または、Nodeが外部リソースへの非同期HTTP GETリクエストを待機している場合、Nodeがコールスタックの処理を継続して「非ブロッキング」になることを可能にするリクエストを処理しているのは何ですか?

2
StringBuilderまたはStringBufferはいつ使用する必要がありますか?
実稼働Webアプリケーションでは、私の仲間のプログラマーがStringBufferをどこでも使用していました。現在、アプリケーションの開発と修正を担当しています。StringBuilderとStringBufferを読んだ後、すべてのStringBufferコードをStringBuilderに置き換えることにしました。これは、データBeanでスレッドセーフが必要ないためです。 例:(各データBeanでStringBufferの使用を確認できます) @Override public String toString() { StringBuffer sb = new StringBuffer();// replace it from StringBuilder sb.append(" ABCD : ").append(abcd); sb.append(", EFGH : ").append(efgh); sb.append(", IJKL : ").append(ijkl); } セッション/リクエストごとに個別のデータBeanを作成します。セッションは、他のユーザーがアクセスできない単一のユーザーによって使用されます。 移行する前に他の点を考慮する必要がありますか? 単一のスレッドがある場合(待機中のスレッドがないか、新しいスレッドがオブジェクトロックを探していない場合)、StringBufferまたはStringBuilderのどちらでも同様に実行されます。StringBufferの場合、オブジェクトロックを取得するのに時間がかかることは知っていますが、オブジェクトロックの保持/解放を除いて、それらの間にパフォーマンスの違いがあるかどうかを知りたいです。

2
準備完了と完了非同期IOメモリ使用量
Rustでの非同期IOの実装に関するこの講演を見ていましたが、Carlは2つの潜在的なモデルに言及しています。準備と完了。 準備モデル: ソケットから読み取ることをカーネルに指示します しばらく他のことをする… カーネルは、ソケットの準備ができたときに通知します あなたが読む(バッファを埋める) 必要なことは何でもしてください バッファーを解放します(Rustで自動的に発生します) 完了モデル: カーネルが満たすようにバッファを割り当てます しばらく他のことをする… カーネルは、バッファがいっぱいになると通知します データで必要なことを何でもする バッファを解放する レディネスモデルを使用するCarlの例では、使用可能なメモリを反復処理して、グローバルバッファを埋め、解放することで、メモリの使用量を大幅に減らすことができます。 今私の仮定: ソケットが「準備完了」であると言われる内部(カーネル空間内)では、データは既に存在します。ネットワーク経由で(またはどこからでも)ソケットに入り、OSはデータを保持しています。 そのメモリ割り当てがレディネスモデルで魔法のように行われないというわけではありません。OSがそれをあなたから抽象化しているだけです。完了モデルでは、OSは、データが実際に流入する前にメモリを割り当てるように求めており、何が起きているかが明らかです。 準備モデルの修正版は次のとおりです。 ソケットから読み取ることをカーネルに指示します しばらく他のことをする… 修正:データはOSに送られます(カーネルメモリの一部) カーネルは、ソケットの準備ができたことを通知します 読み取ります(上記のカーネルバッファーとは別のバッファーを埋めます(または、ポインターを取得しますか?)) 必要なことは何でもしてください バッファーを解放します(Rustで自動的に発生します) /私の仮定 私はたまたまユーザースペースプログラムを小さく保つのが好きですが、実際にここで何が起こっているのかを明確にしたかったのです。1つのモデルが本質的に少ないメモリを使用したり、より高いレベルの同時IOをサポートしたりすることはありません。私はこれについての考えとより深い説明を聞きたいです。
12 async  io 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.