問題タブ [iasyncresult]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - IAsyncResult を明示的に実装する
私は一般的に、インターフェースを部分的に実装することに慎重です。ただし、IAsyncResult
いくつかのまったく異なる使用パターンをサポートしていることを考えると、これは少し特殊なケースです。を呼び出したり、 を使用したり、ポーリングしたりするのではなく、 AsyncState
/パターンをどのくらいの頻度で使用/使用していますか?AsyncCallback
EndInvoke
AsyncWaitHandle
IsCompleted
関連する質問: ThreadPool WorkItem が完了したことを検出する/完了を待機しています。
このクラスを検討してください(非常に近似、ロックが必要です):
(ドキュメントで説明されているように、遅延して作成された)とがWaitHandle
ありますが、 (?)の賢明な実装は見当たりません。それで、それを実装するのは理にかなっていますか? Parallel Extensions ライブラリでは が実装されていますが、暗黙的に実装されているだけであることに注意してください。IAsyncResult
IsCompleted
AsyncState
{return null;}
IAsyncResult
Task
IAsyncResult
IsCompleted
c# - マルチスレッド方式での BeginInvoke/EndInvoke の使用。AsyncCallback、AsyncWaitHandle、IsCompleted はどのように相互作用しますか?
この質問に対する Andreas Huber の回答Concurrent<T>
により、ThreadPool の代わりに非同期デリゲートを使用して実装するというアイデアが得られました。AsyncCallback
ただし、が に渡されたときに何が起こっているのかを理解するのが難しくなっています。BeginInvoke
特に、複数のスレッドが にアクセスしている場合はそうIAsyncResult
です。残念ながら、このケースは MSDN や私が見つけたどこでもカバーされていないようです。さらに、私が見つけたすべての記事は、クロージャーとジェネリックが利用可能になる前に書かれたか、単にそのように見えます。いくつかの質問があります (答えが正しいことを願っていますが、がっかりすることは覚悟しています):
1) クロージャを AsyncCallback として使用すると違いはありますか?
(うまくいかないことを願っています)
2) スレッドが で待機している場合、
a) コールバックが開始する前、または b) 終了後にAsyncWaitHandle
通知されますか?
(できれば b)
3) コールバックが実行されている間、何が返されますか? 私が見ることができる可能
性: b) ; c)コールバックが EndInvoke を呼び出す前、後。
(願わくば b または c)
4)呼び出された後にスレッドが待機すると、スローされますか?
(そうではないことを願っていますが、私はそう期待しています)。IsCompleted
true
false
false
true
DisposedObjectException
AsyncWaitHandle
EndInvoke
答えが私が望んでいるものであれば、これはうまくいくようです:
質問 1 から 3 への回答が私が望んでいるものである場合、私が見る限り、ここにレース条件はないはずです。
c# - C#、IAsyncResult、およびスレッド プール
メソッドを使用しますAction<object>.BeginInvoke()
が、これはスレッドプールを使用しますか?
次の C# コードがあります。
スレッドプールは舞台裏で使用されていますか? または、システムは通常のスレッドを作成しますか?
c# - 2 つの非同期リクエストを簡単にチェーンするにはどうすればよいですか?
2013年編集: async
そしてawait
今、これを簡単にしましょう!:-)
Web サイトをスクリーン スクレイピングするコードをいくつか用意しました (説明のみを目的としています)。
ここで、GetDilbert() を非同期で呼び出したいと思います。デリゲートを使用する簡単な方法:
これは確かに機能しますが、デリゲート スレッドが 2 つの I/O 操作の待機にほとんどの時間を費やすため、あまり効率的ではありません。
私がやりたいことは、 を呼び出しrequest.BeginGetResponse()
、正規表現の一致を実行してから、 を呼び出すことimageRequest.BeginGetResponse()
です。すべて標準の非同期呼び出しパターンを使用し、BeginGetDilbert()とEndGetDilbert( ) の署名を保持します。
私はいくつかのアプローチを試しましたが、完全に満足できるものはありませんでした。これは王道の痛みのようです。したがって、質問です。:-)
編集: イテレータを使用するアプローチは、C# コンパイラ チームによって眉をひそめられているようです。
コンパイラ チームからのお願い:
イテレータを使用してステート マシンや貧弱なコルーチンなどを実装できるのは確かですが、そうしないでほしいと思います。
ツールは本来の目的のために使用してください。ステート マシンを作成する場合は、その一般的な問題を解決するために特別に設計されたライブラリを自分で作成し、それを使用します。
意図したもの以外の目的でツールを使用することは「賢い」ことであり、賢いことは悪いことです。巧妙さはメンテナンス プログラマーにとって理解するのが難しく、巧妙さは拡張しにくく、巧妙さについて推論するのは難しく、巧妙さは人々に「箱から出して」考えさせます。その箱の中に良いものが入っています。
Future<>
それは私のサンプルコードと同じC#にとどまるため、答えに行きます。残念ながら、TPL も F# も Microsoft によって正式にサポートされていません...まだです。
.net - IAsyncResult インターフェイスの適切な実装は何ですか?
私が作成したクラスに柔軟性を追加して、リモート ホストへの接続を確立し、情報交換 (ハンドシェイク) を実行することを検討しています。現在の実装は、接続を確立し、2 つの当事者がハンドシェイクを完了するまで ManualResetEvent で待機することをブロックする Connect 関数を提供します。
クラスの呼び出しがどのように見えるかの例を次に示します。
..そして、クラスが内部で行うことの単純化された高レベルのビューを次に示します。
このクラスに.NET Classic Async パターンを実装することを検討しています。その際、BeginConnect 関数と EndConnect 関数を提供し、クラスのユーザーが次のようなコードを記述できるようにします。
この API を提供できるようにするには、BeginConnect 関数によって返され、EndConnect 関数にそれぞれ渡される IAsyncResult インターフェイスを実装するクラスを作成する必要があります。
さて、私の質問は次のとおりです。クラスに IAsyncResult インターフェイスを実装する適切な方法は何ですか?
明らかな解決策の 1 つは、Connect 関数の署名が一致するデリゲートを作成し、BeginInvoke - EndInvoke を使用してそのデリゲートを非同期的に呼び出すことですが、それは私が探しているものではありません (あまり効率的ではありません)。
私はそれをどのように行うことができるかについて大まかな考えを持っていますが、いくつかの場所でこのパターンを実装する方法で .NET フレームワークの内部をのぞいた後、誰かがこれを成功させたかどうかを尋ねて確認するのが賢明だと感じました。特に注意が必要な問題領域。
ありがとう!
c# - デリゲート/IAsyncResult 呼び出しのジェネリック化
現在、複数のハードコーディングされた dtSearch インデックスを検索し、結果のデータセットをマージしてクライアントに返す WCF Web サービスがあります。次の C# コードがあります。
私の質問は次のとおりです。このロジックを別のジェネリック クラスに移動し、これを 1...n オブジェクトのリストに対して行う最善の方法は何ですか?
私が作成したジェネリック オブジェクトは、すべての物理検索 (SearchPIndex メソッドと SearchCIndex メソッドを置き換えます) を実行しますが、デリゲート/IAsyncResult 呼び出しをジェネリックに統合する方法がわかりません。
これについて私が従うことができるベストプラクティスはありますか?
編集:申し訳ありません...サイトの「ユーザー」として初めて...「回答」は、上記の「コメント」よりも適切な場所のようです。
私はそれで遊ぶつもりですが、これはメソッド内で機能しますか?
c# - AsyncWaitHandle を使用してサードパーティ API を終了させることは適切に実装されていますか?
「session.identify」は、私が呼び出してアクセスできないサードパーティの COM API です。サーバークエリを実行すると、何らかの理由で時々ロックアップします (その結果、結果を待っているメインプログラムが停止します)。
私の試みはそれを AsyncDelegate でラップすることでしたので、タイムアウトを与えることができ、タイムアウトの期限が切れた後、メインプログラムを続行できます(これと同様に、戻り値のみで)。ただし、タイムアウトが影響を与えずにロックアップします。
AsyncHandle.WaitOne を間違って使用していますか? API が中止されないようにする何かが API にある可能性はありますか?
c# - 同期および非同期コールバック
MSDN のドキュメントやコード サンプルを読んでいると、いくつかの用語に混乱します。
C# のコールバックとは何ですか? 特に、同期コールバックと非同期コールバックとは何ですか?
これらを素人目線で教えてください。
また、IAsyncCallback IAsyncResult
インターフェースについても教えてください。どうすれば実装できますか?(非常に簡単な例で)
前もって感謝します。
.net - 非同期HttpWebRequest-スレッド番号
私が次のコードを持っているとしましょう:
コンソールにManagedThreadIdを書き込むときに、かなり多くのスレッドが表示されることを期待しています。もちろん、私は間違っています:)。私は通常、2つの異なるスレッドIDと、たまに3つのスレッドIDしか表示しません。
なぜこの振る舞い?私は何が欠けていますか?
c# - イベントが完了するまでブロックする
非同期イベントが完了するまでブロックするにはどうすればよいですか?
イベント ハンドラーでフラグを設定し、フラグをポーリングして、イベントが呼び出されるまでブロックする方法を次に示します。
ポーリングせずにこれを行う方法はありますか?