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()
任何援助將不勝感激。
你不要被方式需要輸入鎖 - 因爲一切都在這一點上在單UI線程正在發生的事情,你不能讓多個線程訪問文本一次。 – 2012-02-13 01:18:12