2012-02-13 49 views
3

我有一個應用程序與文本框,我需要從多個線程更新文本框。由於我正在更新多線程的文本框,我正在使用以下代碼來確保它在主線程中被調用(如果有必要) - 但即使使用此代碼,我仍然收到錯誤 - 特別是「對象當前正在其他地方使用」 。'對象正在使用其他'錯誤InitializeComponent和調用/鎖

,我使用的代碼:

private static readonly object setTextLockObject = new object(); 
delegate void SetTextCallBack(XtraForm Form, string ControlToUpdate, string ControlValue); 

public void UpdateControlText(XtraForm Form, string ControlToUpdate, string ControlValue) 
{ 
    try 
    { 
     if (Form.Controls[ControlToUpdate].InvokeRequired) 
     { 
      SetTextCallBack callBackHandler = UpdateControlText; 
      IAsyncResult invokeResult = Form.Controls[ControlToUpdate].BeginInvoke(callBackHandler, Form, ControlToUpdate, ControlValue); 
      Form.Controls[ControlToUpdate].EndInvoke(invokeResult); 
     } 
     else 
     { 
      try 
      { 
       lock (setTextLockObject) 
       { 
        Form.Controls[ControlToUpdate].Text = ControlValue.Translate(); 
       } 
      } 
      catch (Exception x) 
      { 
       UpdateStatus(string.Format("ControlText1: {0} ControlToUpdate={1}ControlText={2}", x.Message, ControlToUpdate, ControlValue)); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     UpdateStatus(string.Format("ControlText2: {0} ControlToUpdate={1} ControlText={2}", ex.Message, ControlToUpdate, ControlValue)); 
    } 
} 

我更新與調用該文本,並確保鎖定對象,以便另一個線程不應該能夠訪問onject同時被更新。我期望第二個線程等待鎖釋放,但我得到的「對象目前正在使用」。有人能幫我理解我在這裏做錯了嗎?

我有一個更大的問題,當在窗體上做一個應用程序調用 - 在InitializeComponent我也得到「對象目前正在其他地方使用」。這是一個新的對象,並沒有在其他地方使用。爲什麼初始化組件時可能會出現此錯誤?

at System.Drawing.Graphics.get_PageUnit() 
at DevExpress.Utils.Text.FontsCache.GetFontCacheByFont(Graphics graphics, Font font) 
at DevExpress.Utils.Text.FontsCache.GetStringSize(Graphics graphics, String text, Font font, StringFormat stringFormat, Int32 maxWidth) 
at DevExpress.Utils.Text.TextUtils.GetStringSize(Graphics g, String text, Font font, StringFormat stringFormat, Int32 maxWidth) 
at DevExpress.Utils.Paint.XPaintMixed.CalcTextSize(Graphics g, String s, Font font, StringFormat strFormat, Int32 maxWidth) 
at DevExpress.Utils.AppearanceObject.CalcTextSize(Graphics g, StringFormat sf, String s, Int32 width) 
at DevExpress.XtraEditors.ViewInfo.LabelControlViewInfo.CalcSimpleTextSize(String Text, Boolean useHotkeyPrefix, LabelAutoSizeMode mode, Int32 predWidth) 
at DevExpress.XtraEditors.ViewInfo.LabelControlViewInfo.CalcTextSize(String Text, Boolean useHotkeyPrefix, LabelAutoSizeMode mode, Int32 predWidth) 
at DevExpress.XtraEditors.LabelControl.GetPreferredSize(Size proposedSize) 
at DevExpress.XtraEditors.LabelControl.SetBoundsCore(Int32 x, Int32 y, Int32 width, Int32 height, BoundsSpecified specified) 
at System.Windows.Forms.Control.System.Windows.Forms.Layout.IArrangedElement.SetBounds(Rectangle bounds, BoundsSpecified specified) 
at System.Windows.Forms.Layout.CommonProperties.SetAutoSize(IArrangedElement element, Boolean value) 
at System.Windows.Forms.Control.set_AutoSize(Boolean value) 
at DevExpress.XtraEditors.LabelControl.set_AutoSizeMode(LabelAutoSizeMode value) 
at AccessControl.frmRefillCard.InitializeComponent() 

任何援助將不勝感激。

+0

你不要被方式需要輸入鎖 - 因爲一切都在這一點上在單UI線程正在發生的事情,你不能讓多個線程訪問文本一次。 – 2012-02-13 01:18:12

回答

0

我認爲你通過在UI線程上調用UpdateControlText方法來使事情複雜化。當你連續打電話給他們時,BeginInvokeEndInvoke也沒有意義。

如何:

public void UpdateControlText(XtraForm Form, string ControlToUpdate, string ControlValue) 
{ 
    if (Form.Controls[ControlToUpdate].InvokeRequired) 
    { 
     try 
     { 
      Form.Controls[ControlToUpdate] 
       .Invoke(() => Form.Controls[ControlToUpdate].Text = ControlValue.Translate()); 
     } 
     catch (Exception x) 
     { 
      UpdateStatus(string.Format("ControlText1: {0} ControlToUpdate={1}ControlText={2}", 
       x.Message, ControlToUpdate, ControlValue)); 
     } 
    } 
} 
相關問題