2011-10-14 24 views
1

出於某種原因,我們正在獲取「InvalidOperationException:Object目前正在其他地方使用。」「InvalidOperationException:對象目前正在其他地方使用」在無害的onpaint?

在我們的定製OnPaint,下面(這實際上幾乎是一行代碼的行副本......那裏有那麼少)。

我們已經登錄了下面的異常處理程序來檢測我們是否以某種方式從非UI線程調用了OnPaint ...並且沒有被觸發,但是我們得到了該錯誤記錄(請參閱下面的堆棧跟蹤)。

在我們遇到這些錯誤的機器上,我們也看到了來自其他控件(它們的OnPaints周圍沒有try/catch)的可怕的Red X。

他們可能是相關的,但我不明白什麼可能會導致該錯誤,如果此代碼只從UI線程調用。

任何想法?

這是堆棧跟蹤:

System.InvalidOperationException:對象正在使用 別處。
在System.Drawing.Graphics.CheckErrorStatus(的Int32 狀態)
在System.Drawing.Graphics.DrawRectangle(筆筆,的Int32 的x,的Int32 Y,的Int32寬度,高度的Int32)
在 System.Windows.Forms.ControlPaint .DrawBorderSimple(圖形圖像, 矩形範圍,Colour彩色,ButtonBorderStyle風格)
在 System.Windows.Forms.ControlPaint.DrawBorder(圖形圖像, 矩形範圍,Colour彩色,ButtonBorderStyle風格)
在 MyUserControl.OnPaint(PaintEventArgs的e)

這是類:

public class MyUserControl : UserControl 
{ 
    // Override this to set your custom border color 
    protected Color mBorderColor = SystemColors.ControlDarkDark; 

    public MyeUserControl() 
     : base() 
    { 
     this.BorderStyle = BorderStyle.None; 
     this.Padding = new Padding(1); 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 
     try 
     { 
      ControlPaint.DrawBorder(e.Graphics, this.ClientRectangle, mBorderColor, ButtonBorderStyle.Solid); 
     } 
     catch (Exception ex) 
     { 
      // check if we're not on the UI thread, and if not, log it 
      // log exception 
     } 
    } 
} 
+0

呃,等等,它*是*被絆倒。 –

+0

它沒有被絆倒。獲取記錄的錯誤僅僅是DrawBorder調用失敗的錯誤。有一個單獨的日誌消息,說「從非UI線程調用OnPaint」。我們通過檢查應用程序主窗體上的InvokeRequired來確定。 –

+0

然後GDI + barfs,因爲筆在同一時間在多個Graphics上下文中使用。這不應該讓你感到驚訝。 –

回答

9

所以,我在一段時間之前就想出了這個,但忘了把答案放在這裏。所有有問題的客戶都有一個共同點 - 他們安裝了名爲FileOpen的Adobe插件。它允許用戶閱讀加密的PDF文件。通過在Windows GDI +調用(從.Net OnPaint方法調用)中拋出異常,FileOpen正在做的事情(大概是阻止加密的PDF或其他東西的屏幕截圖)正在干擾我們的應用程序。在使用FileOpen時,他們將我們的應用程序列入白名單,以便它們不會阻止來自我們應用程序的GDI +調用。

是什麼讓這更加棘手的是,阻塞只發生在第一次使用FileOpen查看加密的PDF後...所以你可以安裝它並且不會遇到問題。如果你停止他們的Windows服務FileOpenBroker,它也修復了這個問題(大概服務是做什麼的阻塞)。

只要在這裏發佈此信息,以防其他人看到同樣的問題,因爲這對我們的工作非常頭痛,並且需要花費數週時間才能找出答案。

更新: 有一個非常簡單的解決方法,即停止FileOpen的服務,即FileOpenBroker。您應該能夠在Windows服務列表中找到它,並且可以在Windows任務管理器中找到它。一旦這個過程停止了,它會停止他們正在做的任何事情來搞砸GDI +,然後你應該能夠使用你的程序,直到下次你打開一個加密的PDF。

這已經有一段時間了,所以我不太確定,但可能需要重新啓動才能釋放它們放入GDI +的任何鎖。我記得我建立了一個批處理文件來啓動和停止服務,這樣你就可以使用你的程序,而不會完全禁用使用FileOpen(我認爲它已經安裝,因爲它正在使用該計算機)的能力。

我剛剛接觸到其他人碰到同樣的問題,所以看起來好像FileOpen沒有解決根本問題 - 他們只是通過將我們特定的應用程序列入白名單來給它添加創可貼...公平的警告。

+0

哇,如果這個答案不存在,我不知道我會花多少時間沒有得到任何地方。僅供參考,該服務現在似乎被稱爲「FileOpenManager」。停止它立即解決問題(不需要重新啓動,只需重新啓動應用程序)。感謝您抽出時間回覆此答案。 – musefan

1

本博客文章解釋錯誤消息:

http://msmvps.com/blogs/peterritchie/archive/2008/01/28/quot-object-is-currently-in-use-elsewhere-quot-error.aspx

我所不能比擬的,隨着你雖然發佈代碼,還有沒有其他的圖形操作繼續這種形式?

另外我可以想象一個非UI線程成功執行此代碼,並在同一時間UI線程嘗試和失敗,導致在UI線程上發生錯誤。

+0

您關於非UI線程成功和UI線程失敗的觀點是很好的一點。我想我只希望非UI線程至少在一段時間內失敗,而我們根本沒有看到......但也許有一些緩解因素總是使UI線程失敗。我將非UI線程檢查移至方法的主體,這會給我們一個更好的主意。 –

相關問題