2017-05-12 8 views
0

これは実際にどのように可能かと非常に困惑しています。クリップボードからデータを取得するときにデッドロックが発生する(GetDataObject)

私のアプリケーション(.NET Framework 4.0)には、「貼り付けボタン」があります。アプリケーションの起動時やフォーカスされたオブジェクトが変更されたとき、クリップボード内のデータをチェックしてそのボタンの有効状態を設定します。

これは、この関数がデッドロックしているように見える(1台のマシン上で)数回発生します。そのスタックトレースを見てみましょう:

at System.StubHelpers.InterfaceMarshaler.ConvertToManaged(IntPtr pUnk, IntPtr itfMT, IntPtr classMT, Int32 flags) 
at System.Windows.Forms.UnsafeNativeMethods.OleGetClipboard(IDataObject& data) 
at System.Windows.Forms.Clipboard.GetDataObject(Int32 retryTimes, Int32 retryDelay) 
at System.Windows.Forms.Clipboard.GetDataObject() 
at XXX.Forms.ClipboardHelper.<GetClipboardType>b__5() 
at XXX.DataProvider.Executor.Execute[TResult](Logger logger, LogLevel level, Func`1 action, Boolean throwUp, TResult defaultValue, String format, Object[] arguments) 
at XXX.DataProvider.Executor.Catch[TResult](Logger logger, LogLevel level, Func`1 action, TResult defaultValue, String format, Object[] arguments) 
at XXX.DataProvider.Executor.Catch[TResult](Logger logger, Func`1 action, TResult defaultValue, String format, Object[] arguments) 
at XXX.Forms.Ribbon.RibbonFormHelper.IsPasteButtonEnabled() 
at XXX.Forms.StartForm.XXX.Forms.IClipboardViewer.EnablePasteButton() 
at XXX.Forms.Ribbon.RibbonFormHelper.OrderOverview_FocusChangedEvent(Object sender, EventArgs e) 
at DevExpress.XtraVerticalGrid.VGridControlBase.ActivateEditor(RowValueInfo cell) 
at DevExpress.XtraVerticalGrid.NormalState.MouseDown(MouseEventArgs e) 
at DevExpress.XtraVerticalGrid.BaseHandler.MouseDown(MouseEventArgs e) 
at DevExpress.XtraVerticalGrid.VGridControlBase.OnMouseDown(MouseEventArgs e) 
at System.Windows.Forms.Control.WmMouseDown(Message& m, MouseButtons button, Int32 clicks) 
at System.Windows.Forms.Control.WndProc(Message& m) 
at DevExpress.XtraEditors.Container.EditorContainer.WndProc(Message& m) 
at DevExpress.XtraVerticalGrid.VGridControlBase.WndProc(Message& m) 
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) 
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
at XXX.Program.Main(String[] args) 

私がクリップボードに大量のデータを持っていても、最終的には終了するはずです。私は数分待った...

もう一度動作しますが、私はまだ何が起こっていたのか知​​りたいです!

+0

* "いつフォーカスがあるオブジェクトの変更" * - あなたの代わりに[クリップボードイベント](http://stackoverflow.com/q/621577/1997232)を使用することができます。クリップボードを非難する前に、[mcve](https://stackoverflow.com/help/mcve)を作成して表示できますか?好ましくは、DevExpressを使用しないでください([this](https://www.devexpress.com/Support/Center/Question/Details/T447517)を参照)。 – Sinatr

+0

@Sinatr私はそれ以上自分でそれを再現することはできません。私はその呼び出しスタック(サーバ時、時にはbackgroundworker_completedで発生することがあります。後で発生することもあります) – toATwork

答えて

0

私が見たことがあるクリップボードクラスのWinFormsバージョンにバグがあります。私の場合、(同じAPIを持つ)クリップボードクラスのWPFバージョンを使用すると、問題が解決されました。

https://msdn.microsoft.com/en-us/library/system.windows.clipboard(v=vs.110).aspx

+0

"ole32.dll"の "OleGetClipBoard"を呼び出しますが、System.Windowsバージョンには追加の属性があります。 "SecurityCritical 、SuppressUnmanagedCodeSecurity "を参照してください。これらの属性の意味を確認します。 – toATwork

関連する問題