Вот как мне нравится это делать, я создаю метод на форме следующим образом:
public void AddItemToList(string Item)
{
if(InvokeRequired)
Invoke(new Action<string>(AddItemToList), Item);
else
listBox1.Add(Item);
}
Я предпочитаю вызывать в этом случае, чтобы убедиться, что элементы добавляются синхронно, иначе они могут выйти из строя. Если вы не заботитесь о заказе, вы можете использовать BeginInvoke
, что будет немного быстрее. Поскольку этот метод общедоступен, вы можете получить все это из любого класса в вашем приложении, если можете получить ссылку на свою форму.
Еще одним преимуществом этого является то, что вы можете вызывать его из вашего потока пользовательского интерфейса или потока не из пользовательского интерфейса, и он позаботится о том, чтобы решить, нужно ли ему Invoke
ING. Таким образом, ваши абоненты не должны знать, в каком потоке они работают.
UPDATE
Чтобы ответить на ваш комментарий о том, как получить ссылку на Form
, обычно в приложении Windows Forms, ваш файл Program.cs выглядит примерно так:
static class Program
{
static void Main()
{
MyForm form = new MyForm();
Application.Run(form);
}
}
Как правило, это то, что я бы сделал, особенно в случае приложения "Single Form":
static class Program
{
public static MyForm MainWindow;
static void Main()
{
mainWindow = new MyForm();
Application.Run(form);
}
}
И тогда вы можете получить к нему доступ практически в любом месте с помощью:
Program.MainWindow.AddToList(...);