問題タブ [begininvoke]

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.

0 投票する
3 に答える
4642 参照

.net - すべての BeginInvoke の後に EndInvoke が続く必要がありますか?

Windows フォーム アプリケーションの非同期性について説明している MS ドキュメントのこのページには、次のように記載されています。

必要に応じて、EndInvoke を呼び出してデリゲートから戻り値を取得できますが、これは必須ではありません。(強調追加)

非同期デリゲートの一般的なケースをカバーするこのページでは、別のことが述べられています。

どの手法を使用する場合でも、必ず EndInvoke を呼び出して非同期呼び出しを完了してください。

この二つは真っ向から対立しているようです。

どれが本当ですか? 誰か説明できますか?

Phil Haack による投稿も参照してください。

関連:EndInvokeはオプションですか、一種のオプションですか、間違いなくオプションではありませんか?

0 投票する
1 に答える
2649 参照

c# - パラメータを使用してジェネリック関数を呼び出すためのタイムアウトの実装

サードパーティのCOMdllで呼び出されたメソッドがハングアップしたときに、タイムアウトを強制するために使用するActionデリゲートタイプの使用に頭を悩ませようとしています。多くの検索を行った後、Action<>またはFunc<>を使用して、呼び出されたメソッドがパラメーターを返すかどうかに応じて、最大4つの汎用パラメーターを渡すことができることがわかりました。

この例では、voidを返し、2つのパラメーターを受け取る一連のメソッドでタイムアウトを呼び出したいと思います。以下は私がまとめているコードですが、BeginInvokeを正しくコーディングする方法を決定できません。「Targ1」と「Targ2」を配置するように求められますが、param1またはparam2を入力すると、VS2008はこれらを通知します。値は不確定です。

これまでのコードは次のとおりです。

ここで何が間違っているかについてのアイデアは大歓迎です。

以下は、最初のコメントに基づいて再編集されたコードです

これまでの入力に感謝します。以下をコンパイルします。私はそれを呼び出す際に構文を正しく理解できないようです。

次のメソッドを呼び出して、これをテストしようとしています。

しかし、次のコードは正しくありません。

更新 されたコードフォーラムユーザーが将来参照できるようにコードを投稿しました。以下のコードは機能しているようです。チェックする唯一のポイントは、結果がアクションに関連付けられていないため、同じ関数で「action.EndInvoke(result)」を実行するときに、ユニットテストによって例外がスローされることです。これはおそらく、私のLongProcessが単なるThread.sleepであるためです。これは、この場合、2回目の呼び出しが行われるまでに中止されていないことを意味します。

0 投票する
1 に答える
1604 参照

c# - ねじ切りとソケット

私は次のものを持っています:

次の場合、mySocket は Listen() でループするようになりました。

これが StartListen です。

非同期メソッドのため、物事は実際には「終了」せず、他の何かを続行するためのシグナルを返します。上記の Thread.Start() の後に実装するすべてのコマンドが正しく機能しません。たとえば、StartListen では、isListening = true. スレッドを開始した後、プロパティ IsListening を使用したいと考えています。常に false として返されます。

スレッドを開始するにはどうすればよいですか。非同期メソッド (つまり、ThreadStart.BeginInvoke()) が望ましいでしょうか? それは ManualResetEvent を使用するのと似ていませんか?

0 投票する
3 に答える
6526 参照

c# - Control.BeginInvoke の AsyncCallback メソッドをデリゲートするにはどうすればよいですか? (。ネット)

Control.BeginInvoke を「ファイア アンド フォーゲット」方式以外で使用することは可能ですか? 次のリクエストを変更してコールバック メソッドをデリゲートし、各非同期呼び出しが完了したときに何かを実行できるようにします。

通常のデリゲートでこれを行うことができます.BeginInvokeなど

しかし、Control .BeginInvoke を呼び出しているため、「クロススレッド操作が無効です」というエラーが発生するため、これを行うことはできません。
誰か助けて?

受け取った回答のいくつかに加えて、「なぜ」を明確にします。アプリの残りの部分をロックせずに、GUI でコントロールをロード/更新する必要があります。コントロールには、データセットを取得して渡す必要がある多数のコントロール (ruleListCtls) が含まれています。すなわち

デリゲート コールバック メソッドを提供し、コントロールを修正するコードをそれらが作成されたメインの GUI スレッドに戻すと、これを実行できることがわかりました (クロススレッド エラーを回避するため)。

コールバックを受信したメイン スレッドに委譲する内容は次のとおりです。

これで問題なく動作します。ただし、これが特にエレガントだとは思わないことを除けば、主な問題は例外処理です。これは別の質問かもしれませんが、RefreshRulesDs が例外をスローすると、エラーが (明らかに) GUI スレッドにバブルアップされず、未処理の例外として発生するため、アプリがクラッシュします。これらをキャッチできるまで、この操作全体を同期的に行う必要があります。エラーをキャッチして残りのコントロールを読み込むにはどうすればよいですか? または、適切な例外処理を使用して、この非同期操作を別の方法で実現するにはどうすればよいですか?

0 投票する
4 に答える
4737 参照

c# - 複数の Control.BeginInvoke/Invoke 呼び出しは順番に実行されますか?

Control.BeginInvoke と Control.Invoke の呼び出しが呼び出された順序で実行されるかどうかを知る必要があります。

次のシナリオがあります。

  1. UI スレッドがブロックされている
  2. WCF スレッド呼び出し Control.BeginInvoke
  3. WCF スレッドは Control.Invoke を呼び出します (または、BeginInvoke を再度呼び出します)。
  4. UI スレッドのブロックが解除されました
  5. ??

ステップ 1-4 の実行順序は、示されている順序であることが保証されています (技術的には順序がそのようであるとは限りませんが、私が持っている質問は、順序が示されている場合にのみ関係があります)。

質問は、手順 2 の BeginInvoke 呼び出しの前に、手順 3 の Invoke/BeginInvoke 呼び出しが実行される可能性があるかどうかです。

また、UI スレッドのブロックについてコメントしないでください。

0 投票する
5 に答える
17831 参照

c# - InvokeとBeginInvoke

ご挨拶、私はC#でいくつかのアプリケーションを開発しています。現在、私は糸脱毛を扱っていますが、頭に浮かぶ質問があります。InvokeとBeginInvokeの違いは何ですか?私はいくつかのスレッドを読みました、そして私はここでいくつかの有用な情報を見つけました:ここに

ただし、次のコードのInvokeとBeginInvokeの違いは何ですか。

ここで、MyDelegateはMessageHandler関数への参照です。

BeginInvoke lblStatus.Textを使用しても、Invokeを使用するとラベルが更新されるのに対し、Textは更新されないことに気付きました。さらに、Invokeは実行が完了するのを待つことを知っています。私が興味を持っている最も重要なケースは、この場合、ラベルテキストの更新に違いがある理由です。

0 投票する
13 に答える
124638 参照

c# - C#で作業をしているときにプログレスバーを表示しますか?

作業中にプログレスバーを表示したいのですが、UIがハングし、プログレスバーが更新されません。

マーキーProgressBar方式で無期限に継続するWinFormProgressFormがあります。

これで、を使用するなど、問題を解決する多くの方法があります。BeginInvokeタスクが完了するのを待って、を呼び出しますEndInvokeBackgroundWorkerまたはまたはを使用しThreadsます。

EndInvokeで問題が発生していますが、それは問題ではありません。問題は、そのような状況を処理するために使用する最良かつ最も簡単な方法であり、プログラムが機能していて応答しないことをユーザーに示さなければならない場合、そして効率的で効果のない可能な限り最も単純なコードでそれをどのように処理するかです。リークし、GUIを更新できます。

同様BackgroundWorkerに、複数の関数を持っている必要があり、メンバー変数を宣言する必要があります。また、ProgressBarフォームへの参照を保持し、それを破棄する必要があります。

編集BackgroundWorker進行状況の通知が届かない可能性があるため、答えではありません。これは、外部関数への単一の呼び出しであるため、への呼び出しがないことを意味しますが、進行状況バーの呼び出しを続ける必要がProgressChangedあります回転し続けるために。DoWorkApplication.DoEvents();

恩恵は、この問題に対する最良のコードソリューションです。ワーカー関数がメインスレッドで機能している間、Marqueプログレスバーが機能するように呼び出す必要がありApplication.DoEvents()ますが、進行状況の通知は返されません。進行状況を自動的に報告するために.NETマジックコードは必要ありませんでした。次よりも優れたソリューションが必要でした。

プログレスバーを維持します(フリーズしないことを意味しますが、マークを更新します)

0 投票する
1 に答える
1014 参照

c# - C#UserControlBeginInvoke問題

独自のバックグラウンドワーカースレッドを持つC#ユーザーコントロールがあります。このワーカースレッドは、コントロールのコンストラクターで開始され、コントロールが破棄されると停止します。

スレッドはデリゲートを使用してBeginInvoke-Methodを定期的に呼び出しますが、 「ウィンドウハンドルが作成されるまで、コントロールでInvokeまたはBeginInvokeを呼び出すことはできません」という例外が発生する場合があります。発生します。

ここで、コントロールが完全に作成されていない限り、ワーカースレッドからBeginInvokeを呼び出して呼び出しを行わないようにできるかどうかを確認するにはどうすればよいですか?

この問題は、リリースをコンパイルするときにのみ発生します。デバッグモードではありません。

敬具

0 投票する
4 に答える
1906 参照

.net - .NET での BeginInvoke の問題

YouTubeにクエリを送信し、合計結果をテキストボックスに送信する次のコードがあります。結果を警告するだけなら問題ありませんが、結果をテキストボックスに割り当てることはできません。理由を教えてください。

そしてエラー

クロススレッド操作が無効です: コントロール 'txtSearch' は、それが作成されたスレッド以外のスレッドからアクセスされました。

0 投票する
2 に答える
2075 参照

c# - BeginInvokeの問題(デリゲートはアクションを実行しません)

あなたが元気であることを願っています。

私はBeginInvokeで奇妙な問題に直面しています、そして私は本当にあなたの助けが必要です!

Reportタイプの複数のインスタンスを含むReportingクラスがあります

これはフォームに表示されるユーザーコントロールであり、これと同じユーザーコントロールがWindowsサービスからも使用され、毎分レポートを生成(および画像として保存)されます。

毎分レポートを生成するために、私はSystem.Threading.Timerを使用しています。

レポートを生成する私のクラスは、サービスで次のようになります。

}

ほとんどすべてがうまく機能しています..CreateReportがThreadPoolの他のスレッドで実行されることもあります。したがって、レポートとそのコンポーネント(他のスレッドで作成されたもの)に対していくつかのアクションを実行している場合、InvokeRequiredはtrueに設定され、完全に明白です...しかし、BeginInvokeはアクションを実行しません!レポートが作成されたスレッドがもう存在しないようなものです...

この問題を回避する方法について何かアイデアはありますか?

私がこの問題に直面しているのは今から1週間で、グーグルでスタックオーバーフローしました。しかし、何もありません!

どうもありがとう !