これは実際にどのように可能かと非常に困惑しています。クリップボードからデータを取得するときにデッドロックが発生する(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)
私がクリップボードに大量のデータを持っていても、最終的には終了するはずです。私は数分待った...
もう一度動作しますが、私はまだ何が起こっていたのか知りたいです!
* "いつフォーカスがあるオブジェクトの変更" * - あなたの代わりに[クリップボードイベント](http://stackoverflow.com/q/621577/1997232)を使用することができます。クリップボードを非難する前に、[mcve](https://stackoverflow.com/help/mcve)を作成して表示できますか?好ましくは、DevExpressを使用しないでください([this](https://www.devexpress.com/Support/Center/Question/Details/T447517)を参照)。 – Sinatr
@Sinatr私はそれ以上自分でそれを再現することはできません。私はその呼び出しスタック(サーバ時、時にはbackgroundworker_completedで発生することがあります。後で発生することもあります) – toATwork