Итак, если вы правильно поняли, вы спрашиваете, как изменить графический интерфейс из другого потока.
Это делается через конструкцию, называемую SynchronizationContext, которая по существу обеспечивает способ запуска кода в другом потоке. Поэтому в вашем случае, если вы хотите изменить текст метки, определенной в потоке GUI, вы должны взять SynchronizationContext
, соответствующий вашему потоку графического интерфейса пользователя, и отправить ему код через другой поток.
Другая концепция, с которой вам нужно познакомиться, - это Задачи. A Task
- это абстракция, функционально то же, что и поток. Одновременно могут выполняться две задачи. Task.Run
запускает новый Task
с рабочей нагрузкой, представленной функцией.
С учетом сказанного, вот пример в WPF:
public class MainWindow
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
var context = SynchronizationContext.Current;
Task.Run(() => context.Post(state => Button.Content = "Hello World!"));
}
}
Обратите внимание, что даже если я внутри Task.Run
(что означает, что я не на GUI потоке), я все еще в состоянии выполнить код на Button
, разместив сообщение SynchroniztaionContext
.
Edit: Если вы не знакомы с Task еще, и вы хотели бы использовать Thread
вместо этого, вы можете быть в состоянии сделать это, а также:
var context = SynchronizationContext.Current;
var thread = new Thread(() => context.Post(state => Button.Content = "Hello World!"));
thread.Start();
Возможный дубликат http://stackoverflow.com/questions/661561/how-to-update-the-gui-from-another-thread-in-c?rq=1? –
C# (в отличие от java) - это современный, правильно спроектированный язык программирования, который имеет языковые функции, которые облегчают запись асинхронного/потокового кода. Для получения дополнительной информации см. [Асинхронное программирование с использованием Async и Await (C# и Visual Basic)] (https://msdn.microsoft.com/en-us/library/hh191443.aspx) в MSDN. –