問題タブ [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.
vb.net - VB.Net:Application.Run()の動作を理解する
ハンス・パッサントはここで私に素晴らしい答えをくれたので、私はその仕組みを理解するためにもっと詳細を尋ねることを考えましたApplication.Run()
。
ドキュメントから理解できる限りApplication.Run()
、現在のスレッドでメッセージループが開始され、ユーザー入力を処理できるようになっているようです(そうですか?)。オーバーロードされたバージョン Application.Run(Form)
は基本的に同じことを行いますが、フォームが閉じたときにのみ存在し、デフォルトでフォームを表示します。
それはいくつかの質問を提起します:
Main()
サブからユーザーと通信できる関数(メッセージボックスなど)を呼び出して、終了するのを待つにはどうすればよいでしょうか。ShowDialog
起動時にフォームをすぐに表示したくない場合を除いて、機能する可能性があります(たとえば、起動されたforがシステムトレイに最小化されている場合)- 基本的に、状況は次のようになります。サブ `Main`には、20分で実行するタスクのリストがあり、プログラムが20分で動作することをユーザーに通知するシステムトレイアイコンがあります。タイマーは20分後に刻み、約を実行する必要があります。進行状況ダイアログのインスタンスを作成するたびに、最初はタスクバーに非表示になっている15個のタスク。
- `ShowDialog`は、不要なフォームを表示します。したがって、私が行う方法は、進行状況ダイアログに次のタスクを開始する関数へのコールバックを渡すことです。しかし、それは2番目の進行状況フォームが終了する前に、最初の進行状況フォームを終了しませんか?つまり、15のフォームが開かれることになります...
- したがって、解決策は、メインアプリケーションループでコールバックを呼び出す(begininvoke?)ことです...ただ、コールバックを呼び出すためのループに関連付けられたフォームがないため、これを行う方法がわかりません。 ..。。
私の質問が明確であることを願っています(私は多くのことを混乱させるかもしれません、ごめんなさい)、
ありがとう、
CFP。
c# - BeginInvoke はフォームをアクティブにします
C# で記述された WinForms アプリケーションがあります。開いたときに最初に表示される画面は、読み込みに時間がかかるダッシュボード画面です。データ読み込みメソッドは、デリゲートで BeginInvoke を使用して呼び出されます。その部分は問題ありません。私の問題は、読み取ったデータをいくつかのグリッドにロードしたいときです。UIスレッドに戻るコードは次のようになります
これはすべてエラーなしで発生します。私の問題は、ダッシュボードのフォームが画面の上部にジャンプすることです。データの読み込みに時間がかかる場合、ユーザーは既に別のアプリにアクセスしている可能性があります (これは非常に面倒です)。LoadDashboardData メソッドは、いくつかの DataGridView コントロールの DataSource プロパティを割り当てる以外には、ほとんど何もしません。
.net - メソッドを非同期で数回呼び出すと OutOfMemory 例外が発生する
問題: 大きな PDF ファイル (50Mb、1500 ページ) を使用して非同期に LoadFile() を数回 (10 ~ 20 回で十分) 呼び出すと、すぐに OutOfMemory 例外が発生します。EndInvoke() の後に GC.Collect() を呼び出すと、問題が解決します。
同期呼び出しはうまく機能します (メモリ リークは発生しません)。
GC.Collect() を直接呼び出さずに解決する方法についてのアイデアはありますか?
c# - マルチスレッド環境でのSendOrPostCallbackとActionの違いは?
私はスレッドの操作にかなり慣れていません。の値を設定しようとしていましたDependencyProperty
:
セッターで SendOrPostCallback を使用する必要があるという難しい方法に気付きました (メソッドを呼び出すときに引数を提供するため)。アクションでは機能しません(引数が欠落しているためです。そして、wpfは実際にはそれについての雌犬であり、「ソースが利用できません」でTargetParameterCountExceptionの原因をデバッグして見つけ、手がかりがまったくありません.
SendOrPostCallback を使用する必要があるのはなぜですか? この場合、これが正しいものであることをどのように知る必要がありますか? 実際にセッターを呼び出すと、次の方法で機能するためです。
コースの代わりに SendOrPostCallback を使用すると、TargetParameterCountException が発生します。
そのような一見矛盾しているように見えることは、ただの常識なのだろうか?少なくともSendOrPostCallback、Action、およびBeginInvokeをキーワードとしてグーグルで検索しても意味のある結果が得られなかったため、ここで少し迷っています。
c# - ログリーダーを理解しようとしている
私はいくつかのコードを理解しようとしています。ログデータを出力する小さなプログラムです。これは、DataTable によって埋められる DataGridView を含むフォームを作成することによって行われます。フォーム クラスには、リフレッシュ機能 (RefreshPresentation) もあります。BusinessLogic クラスは、DataTable を更新し、フォームで更新機能を呼び出すという実際の作業を行います。だから私は機能をかなり理解していますが、プログラムがそのように構成されている理由はわかりません。
- businessLogic.DoWork が通常のメソッド呼び出しではなく、スレッドとして実行されるのはなぜですか?
- RefreshPresentation 機能について誰か説明してもらえますか? (BeginInvoke とデリゲート)
- MainForm をパラメーターとして BusinessLogic に渡すことは良い考え/実践ですか?
これは、アプリケーションのメイン エントリ ポイントです。
これはフォームの関連部分です。
これがビジネスロジックです。
.net - 印刷ダイアログフォーカスの問題
デスクトップアプリケーションでPrintDialogを使用しています。Buttonまたはコンテキストメニューから呼び出されると、正常に機能します。しかし、PrintDialogを呼び出すためにツールチップボタンをクリックすると、printdialogウィンドウがアクティブであるにもかかわらず、印刷ボタンにフォーカスが移りません。印刷物を取得するには、2回クリックする必要があります。
私が得た解決策は、デリゲートでBeginInvokeを使用して非同期を呼び出すことです。これで、次のコードでフォーカスを取得できます。
ShowThePrintDialog printD = new ShowThePrintDialog(p.ShowDialog); this.BeginInvoke(printD);
DialogResultをキャプチャし、printdialogでクリックされたボタンに基づいてさらに進みます。
BeginInvokeの使用中にDialogResultをキャプチャする方法を教えてもらえますか?
ラマン
.net - ハンドルが破壊される前/後に機能するControl.BeginInvokeのバリアントはありますか?
基になる非同期オブジェクトの状態を表示するコントロールがあります。オブジェクトはイベントを発生させます。イベントはフォームに到着し、基本的にキューに入れられ、最終的にBeginInvokeを使用して呼び出されます。
コントロールを廃棄すると問題が発生します。物事は非同期で発生しているため、廃棄中にイベントコールバックがキューに入れられる可能性が常にあるため、InvalidOperationExceptionが発生することがあります(ウィンドウハンドルが作成されるまで、コントロールでInvokeまたはBeginInvokeを呼び出すことはできません)。
これは私が望む振る舞いではありません。コントロールが破棄された場合でもコールバックを実行したい(コールバックで例外が発生した場合でも、それは私にとってはるかに便利な例外です!)。各コールバックで破棄された状態の動作を処理したい(通常は破棄された場合はスキップしますが、場合によっては[たとえば、1つのコントロールがイベントをログに記録し(オプションでファイルに)、ログデータを失いたくない!])。
私が望むように機能する方法はありますか?もろくないものを自分で書くことはできますか?
.net - Delegate.EndInvoke()は本当に必要ですか?
Delegate.BeginInvokeを使用する場合は、Delegate.EndInvokeが必要であるという、いくつかのフォーラムとスタックオーバーフローの質問を読んだことがあります。BeginInvokeの使用について私が読んだ記事の多くは、EndInvokeの使用について言及していません。また、BeginInvokeのみを使用して本番コードをデプロイしましたが、メモリの問題はないようです。私がBeginInvokeを使用した方法は、通常、スレッドがいつ終了するか、または処理にかかる時間を気にしないスレッドを使用することです。
c# - BeginInvoke: 呼び出しが多すぎます
次のコードを見てください。
非同期的に呼び出されているメソッドが 5 分間スリープする場合。では、lac スレッドが 5 つ作成されたというのは正しいですか?
ありがとう。
.net - MulticastDelegate で BeginInvoke を使用できますか?
ライブラリ クラスから一連のイベントを発生させたいのですが、一部のイベント サブスクライバーが失礼で、一部のイベントの処理に時間がかかり、イベントを発生させているスレッドがブロックされるのではないかと心配しています。スレッド プール スレッドを使用して各イベントを発生させることで、発生スレッドを保護できると考えました。
イベントのサブスクライバーが 1 つしかない場合は問題なく動作しますが、2 番目のサブスクライバーが到着するとすぐにDataPacketReceived
マルチキャスト デリゲートになり、"デリゲートにはターゲットが 1 つだけ必要です" というエラー メッセージと共に引数例外が発生します。別のスレッドでイベントを発生させる簡単な方法はありますか、またはスレッドを開始してそこからイベントを発生させる必要がありますか?