-1

ユーザーがパネルでワークフローを編集できるようにするwinformsユーザーコントロールがあります。ワークフローは、ユーザー コントロールでもあるビルディング ブロックとワイヤで構成されます。

アプリを winforms.exe から別の WCF アプリの winform コントロールに移行したとき、CPU 使用率が 25% (= 4 コア マシンのシングル コアの 100%) に上昇することに気付きました。

次の場合、CPU は実行時に 0 ~ 1% に戻ります。

既存のコントロールからワークフロー パネルをクリアする、または

画面のフォーカスを別のアプリに移動したり (バックグラウンドで実行するためにそのままにしておく)、同じアプリ内の別のタブに移動したりします。

これは Windows フォーム ホスティング アプリケーションでは発生せず、WCF でのみ発生するということは重要です。

ベース ワークフロー ブロック UC の WndProc メソッドをオーバーライドしている場所を見ましたが、私もそうしましたが、WndProc メソッドを何度も呼び出しているのか、停止する方法がわかりません。

私のスタックは次のようになります。

BaseControls.dll!Ast.Admin.Controls.BaseControl.WndProc(ref System.Windows.Forms.Message m = {System.Windows.Forms.Message}) 行 91 C# System.Windows.Forms.dll!System.Windows.Forms .Control.ControlNativeWindow.OnMessage(ref System.Windows.Forms.Message m) + 0x1d バイト
System.Windows.Forms.dll!System.Windows.Forms.Control.ControlNativeWindow.WndProc(ref System.Windows.Forms.Message m) + 0xaa バイト
System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.Callback(System.IntPtr hWnd, int msg = 129, System.IntPtr wparam, System.IntPtr lparam) + 0x6f バイト System.Windows.Forms. dll!System.Windows.Forms.NativeWindow.WindowClass.Callback(System.IntPtr hWnd, int msg, System.IntPtr wparam, System.IntPtr lparam) + 0x51 バイト
[マネージド トランジションにネイティブ]
[Managed to Native Transition]
System.Windows.Forms.dll!System.Windows.Forms.UnsafeNativeMethods.CreateWindowEx(int dwExStyle, string lpszClassName, string lpszWindowName, int style, int x, int y, int width, int height, System. Runtime.InteropServices.HandleRef hWndParent、System.Runtime.InteropServices.HandleRef hMenu、System.Runtime.InteropServices.HandleRef hInst、オブジェクト pvParam) + 0x3f バイト
System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.CreateHandle(System .Windows.Forms.CreateParams cp) + 0x22d バイト System.Windows.Forms.dll!System.Windows.Forms.Control.CreateHandle() + 0x12c バイト
System.Windows.Forms.dll!System.Windows.Forms.Control.CreateControl (bool fIgnoreVisible = false) + 0x89 バイト
System.Windows.Forms.dll!System.Windows.Forms.Control.CreateControl() + 0x31 バイト
System.Windows.Forms.dll!System.Windows.Forms.Control.ControlCollection.Add(System.Windows.Forms.Control 値= {Ast.Controls.AllianceEnterprise.DataSource}) + 0x1dd バイト
AdminUC.dll!Ast.Admin.AdminUC.RuleBuilderUC.AddItem(object objData = "C:\Ast Alliance NextUI\Bin\Escalation\Controls\Actions\DataConnector.dll ;Ast.Controls.AllianceEnterprise.DataSource") + 0x510 バイト AdminUC.dll!Ast.Admin.AdminUC.RuleBuilderUC.drawingPanel_DragDrop(オブジェクト送信者 = {System.Windows.Forms.Panel}, System.Windows.Forms.DragEventArgs e = { System.Windows.Forms.DragEventArgs}) + 0xa0 バイト
System.Windows.Forms.dll!System.Windows.Forms.Control.OnDragDrop(System.Windows.Forms.DragEventArgs drgevent) + 0x73 バイト
System.Windows.Forms.dll!System.Windows.Forms.Control.System.Windows. Forms.IDropTarget.OnDragDrop(System.Windows.Forms.DragEventArgs drgEvent) + 0x15 バイト System.Windows.Forms.dll!System.Windows.Forms.DropTarget.System.Windows.Forms.UnsafeNativeMethods.IOleDropTarget.OleDrop(object pDataObj, int grfKeyState, long pt, ref int pdwEffect = 1) + 0x5d バイト [ネイティブから管理された移行]
[管理されてネイティブへの移行]
System.Windows.Forms.dll!System.Windows.Forms.Control.DoDragDrop(オブジェクト データ、System.Windows.Forms.DragDropEffects allowedEffects) + 0xed バイト AdminUC.dll!Ast.Admin.AdminUC.RuleBuilderUC.listView_MouseDown(オブジェクト送信者 = {System.Windows.Forms.ListView}, System.Windows.Forms.MouseEventArgs e = {X = 16 Y = 6 ボタン = 左}) + 0x285 バイト System.Windows.Forms.dll!System.Windows.Forms.Control. OnMouseDown(System.Windows.Forms.MouseEventArgs e) + 0x73 バイト
System.Windows.Forms.dll!System.Windows.Forms.ListView.WmMouseDown(ref System.Windows.Forms.Message m = {System.Windows.Forms.Message }, System.Windows.Forms.MouseButtons ボタン, int クリック) + 0x7a バイト
System.Windows.Forms.dll!System.Windows.Forms.ListView.WndProc(ref System.Windows.Forms.Message m) + 0xf7 バイト System.Windows.Forms.dll!System.Windows.Forms.Control.ControlNativeWindow.OnMessage (ref System.Windows.Forms.Message m) + 0x1d バイト
System.Windows.Forms.dll!System.Windows.Forms.Control.ControlNativeWindow.WndProc(ref System.Windows.Forms.Message m) + 0xaa バイト
System.Windows .Forms.dll!System.Windows.Forms.NativeWindow.Callback(System.IntPtr hWnd, int msg = 513, System.IntPtr wparam, System.IntPtr lparam) + 0x6f バイト [ネイティブからマネージドへの移行]
[マネージドからネイティブへの移行]
WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame フレーム = {System.Windows.Threading.DispatcherFrame}) + 0xb5 バイト WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrame( System.Windows.Threading.DispatcherFrame フレーム) + 0x3c バイト
PresentationFramework.dll!System.Windows.Application.RunDispatcher(オブジェクトは無視) + 0x34 バイト
PresentationFramework.dll!System.Windows.Application.RunInternal(System.Windows.Window ウィンドウ) + 0x16f バイト
PresentationFramework.dll!System.Windows.Application.Run(System.Windows.Window ウィンドウ) + 0x33 バイト PresentationFramework.dll!System.Windows.Application.Run() + 0x69 バイト Ast Browser.exe!Ast.NextUI.GUI .Shell.App.StartApplication() + 0x75 バイト
Ast Browser.exe!Ast.NextUI.GUI.Shell.App.Main(string[] args) + 0x22b バイト

ここで、basecontrol はワークフロー ブロックの基本クラスです。

これは、パネルに最初のブロックを置いた瞬間から永遠に起こり続けます。このすべての苦痛を正当化するために画面上で何かをしているわけではありません.

4

1 に答える 1

0

これはそこで何をしているのですか:

[Managed to Native Transition]
 System.Windows.Forms.dll!System.Windows.Forms.UnsafeNativeMethods.CreateWindowEx(int dwExStyle, string lpszClassName, string lpszWindowName, int style, int x, int y, int width, int height, System.Runtime.InteropServices.HandleRef hWndParent, System.Runtime.InteropServices.HandleRef hMenu, System.Runtime.InteropServices.HandleRef hInst, object pvParam) + 0x3f bytes
System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.CreateHandle(System.Windows.Forms.CreateParams cp) + 0x22d bytes 
System.Windows.Forms.dll!System.Windows.Forms.Control.CreateHandle() + 0x12c bytes

初めてウィンドウを作成するため、OnPaint が呼び出されているようです。

これが典型的なコール スタックであり、ドラッグ アンド ドロップ アプリケーション中に 1 秒間に何百回も呼び出される場合、その理由を突き止めて停止する必要があります...

于 2012-08-23T13:53:49.643 に答える