У меня есть приложение с текстовым полем, в котором мне нужно обновить текстовое поле из нескольких потоков. Поскольку я обновляю текстовое поле из нескольких потоков, я использую следующий код, чтобы убедиться, что он вызывается из основного потока, если это необходимо - но даже с этим кодом я все еще получаю ошибки - в частности, «Объект в настоящее время используется в другом месте» .
Код, который я использовал:
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));
}
}
Я обновляю текст с помощью invoke и проверяю блокировку объекта, чтобы другой поток не мог получить доступ к объекту во время обновления. Я ожидаю, что второй поток будет ожидать освобождения блокировки, но вместо этого я получаю «объект в настоящее время используется». Может ли кто-нибудь помочь мне понять, что я здесь делаю неправильно?
У меня есть еще большая проблема, когда во время выполнения аппликации в форме - в 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()
Любая помощь будет принята с благодарностью.