Как вы можете изменить текстовые значения или числовые значения в элементе управления текстовым полем или в элементе управления numicUpDown или добавить элементы и/или подэлементы в элемент управления списком или обновить индикатор выполнения из потока, не имея создать несколько определений, таких как новая функция И новый делегат?update control thread safe
0
A
ответ
1
Я создал потокобезопасный набор расширенных функций для набора элементов управления, которые мне нужны для созданного приложения, для которого требуется много потоковых обновлений формы. Класс добавляет методы непосредственно в элементы управления, поэтому для обеспечения доступа к потоку элементов управления требуется очень минимальное изменение кода. Просто добавьте этот класс в свой проект.
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
namespace System.Windows.Forms
{
public static class TSFormExtenders
{
#region Control
public static void SetEnabledTS(this Control x, bool s)
{
if (x.InvokeRequired)
{
x.Invoke(new EventHandler(delegate(object o, EventArgs a)
{
x.SetEnabledTS(s);
}));
}
else
{
x.Enabled = s;
}
}
public static bool GetEnabledTS(this Control x, bool def = false)
{
if (x.InvokeRequired)
{
bool m_ret = def;
x.Invoke(new EventHandler(delegate(object o, EventArgs a)
{
m_ret = x.GetEnabledTS();
}));
return m_ret;
}
else
{
return x.Enabled;
}
}
public static void SetTextTS(this Control x, String s)
{
if (x.InvokeRequired)
{
x.Invoke(new EventHandler(delegate(object o, EventArgs a)
{
x.SetTextTS(s);
}));
}
else
{
x.Text = s;
}
}
public static String GetTextTS(this Control x, String def = "")
{
if (x.InvokeRequired)
{
String m_ret = def;
x.Invoke(new EventHandler(delegate(object o, EventArgs a)
{
m_ret = x.GetTextTS();
}));
return m_ret;
}
else
{
return x.Text;
}
}
public static void SetVisibleTS(this Control x, bool s)
{
if (x.InvokeRequired)
{
x.Invoke(new EventHandler(delegate(object o, EventArgs a)
{
x.SetVisibleTS(s);
}));
}
else
{
x.Visible = s;
}
}
public static bool GetVisibleTS(this Control x, bool def = true)
{
if (x.InvokeRequired)
{
bool m_ret = def;
x.Invoke(new EventHandler(delegate(object o, EventArgs a)
{
m_ret = x.GetVisibleTS();
}));
return m_ret;
}
else
{
return x.Visible;
}
}
public static void SetSizeTS(this Control x, Size s)
{
if (x.InvokeRequired)
{
x.Invoke(new EventHandler(delegate(object o, EventArgs a)
{
x.SetSizeTS(s);
}));
}
else
{
x.Size = s;
}
}
public static Size GetSizeTS(this Control x)
{
if (x.InvokeRequired)
{
Size m_ret = new Size();
x.Invoke(new EventHandler(delegate(object o, EventArgs a)
{
m_ret = x.GetSizeTS();
}));
return m_ret;
}
else
{
return x.Size;
}
}
#endregion
#region CheckBox
public static void SetCheckedTS(this CheckBox x, bool s)
{
if (x.InvokeRequired)
{
x.Invoke(new EventHandler(delegate(object o, EventArgs a)
{
x.SetCheckedTS(s);
}));
}
else
{
x.Checked = s;
}
}
public static bool GetCheckedTS(this CheckBox x)
{
if (x.InvokeRequired)
{
bool m_ret = false;
x.Invoke(new EventHandler(delegate(object o, EventArgs a)
{
m_ret = x.GetCheckedTS();
}));
return m_ret;
}
else
{
return x.Checked;
}
}
#endregion
#region NumericUpDown
public static void SetValueTS(this NumericUpDown x, Decimal s)
{
if (x.InvokeRequired)
{
x.Invoke(new EventHandler(delegate(object o, EventArgs a)
{
x.SetValueTS(s);
}));
}
else
{
x.Value = s;
}
}
public static Decimal GetValueTS(this NumericUpDown x)
{
if (x.InvokeRequired)
{
Decimal m_ret = 0;
x.Invoke(new EventHandler(delegate(object o, EventArgs a)
{
m_ret = x.GetValueTS();
}));
return m_ret;
}
else
{
return x.Value;
}
}
public static void SetMinTS(this NumericUpDown x, Decimal s)
{
if (x.InvokeRequired)
{
x.Invoke(new EventHandler(delegate(object o, EventArgs a)
{
x.SetMinTS(s);
}));
}
else
{
x.Minimum = s;
}
}
public static void SetMaxTS(this NumericUpDown x, Decimal s)
{
if (x.InvokeRequired)
{
x.Invoke(new EventHandler(delegate(object o, EventArgs a)
{
x.SetMaxTS(s);
}));
}
else
{
x.Maximum = s;
}
}
#endregion
#region ProgressBar
public static void SetValueTS(this ProgressBar x, Int32 s)
{
if (x.InvokeRequired)
{
x.Invoke(new EventHandler(delegate(object o, EventArgs a)
{
x.SetValueTS(s);
}));
}
else
{
x.Value = s;
}
}
public static Int32 GetValueTS(this ProgressBar x)
{
if (x.InvokeRequired)
{
Int32 m_ret = 0;
x.Invoke(new EventHandler(delegate(object o, EventArgs a)
{
m_ret = x.GetValueTS();
}));
return m_ret;
}
else
{
return x.Value;
}
}
public static void SetMinTS(this ProgressBar x, Int32 s)
{
if (x.InvokeRequired)
{
x.Invoke(new EventHandler(delegate(object o, EventArgs a)
{
x.SetMinTS(s);
}));
}
else
{
x.Minimum = s;
}
}
public static void SetMaxTS(this ProgressBar x, Int32 s)
{
if (x.InvokeRequired)
{
x.Invoke(new EventHandler(delegate(object o, EventArgs a)
{
x.SetMaxTS(s);
}));
}
else
{
x.Maximum = s;
}
}
#endregion
#region ListView
public static void AddItemTS(this ListView x, ListViewItem s)
{
if (x.InvokeRequired)
{
x.Invoke(new EventHandler(delegate(object o, EventArgs a)
{
x.AddItemTS(s);
}));
}
else
{
x.Items.Add(s);
}
}
public static void AddItemTS(this ListViewItem x, System.Windows.Forms.ListViewItem.ListViewSubItem s)
{
if (x.ListView.InvokeRequired)
{
x.ListView.Invoke(new EventHandler(delegate(object o, EventArgs a)
{
x.AddItemTS(s);
}));
}
else
{
x.SubItems.Add(s);
}
}
#endregion
}
}
Смежные вопросы
- 1. Thread Safe Control - Crashing VS 2008
- 2. Thread Safe Вызов
- 3. Is boost :: thread thread-safe?
- 4. JAX-WS Thread safe
- 5. Thread safe std :: cout
- 6. WinForms Thread-safe Controls
- 7. Thread Safe Timed Events
- 8. Thread Safe Event Calls
- 9. Thread-safe NSMutableArray вопрос
- 10. Thread safe Карта очередей
- 11. Thread safe: Экземпляр класса
- 12. thread safe static class
- 13. Thread Safe Servlet
- 14. Thread safe use CallContext.LogicalSetData
- 15. XmlPullParser newPullParse thread safe
- 16. Perl Thread Safe Modules
- 17. .NET DynamicMethod Thread Safe?
- 18. Is String.intern() thread safe
- 19. Spring + Thread safe singletons
- 20. Thread safe, Silverlight
- 21. Guava FluentIterable thread-safe
- 22. Thread-safe CollectionViewSource
- 23. Pymongo script thread safe
- 24. Thread-safe in delphi
- 25. using thread safe local_time_r
- 26. Thread-Safe hooking function
- 27. Thread-safe DataSet
- 28. - это System.DirectoryServices.AccountManagement.GroupPrincipal thread safe?
- 29. C++ Thread safe vector.erase
- 30. thread safe nsdictionary
Я использую [SynchronizationContext] (http://msdn.microsoft.com/en-us/library/system.threading.synchronizationcontext.aspx) (за небольшую обертку), которая абстрагирует все и легко вызовите так, чтобы синхронизация осталась на сайте вызова без дополнительного шаблона. В большинстве случаев я нахожу, что операции должны выполняться вместе - поэтому оставлять его на сайте вызова более чистым, более эффективным и позволяет при необходимости выполнять синхронизацию или асинхронное поведение. – 2013-03-10 11:31:41