2015-03-31 2 views
0

У меня есть большая проблема, и надеюсь, что вы, ребята, можете помочь мне ...текст Изменение этикетки и начать темы, в том же ничтожной

мне нужно, чтобы начать Thread не называется ListenOnSocket, никаких проблем до сих пор ..

Thread ListenOnSocket = new Thread(newThreadStart(Form1.ListenOnSocket)); 
ListenOnSocket.Start(); 

Но когда я хочу изменить метку в пределах ListenOnSocket, я получаю ссылку на объект, которая требуется для нестатического поля, метода или свойства.

Так обычно вы PASSE этикетку на делая это

public static void ListenOnSocket(Label lblstatus) 
{ 
    //i want to change the label from here. 
    lblstatus.text = "Hello"; 
} 

, но затем я получаю

No overload for ListenOnSocket matches delegate System.Threading.Threadstart in my threadstart.

Может кто-нибудь, пожалуйста, помогите, я действительно застрял, извините, если не так много Продолжайте, я новичок в C#.

+2

Даже если вы исправите ошибку компилятора, это не сработает. Ваш следующий вопрос: я получаю [Исключение перекрестных потоков] (http://stackoverflow.com/questions/10775367/cross-thread-operation-not-valid-control-textbox1-accessed-from-a-thread-othe). Поэтому я не собираюсь исправлять это; Я рекомендую взять книгу и прочитать. Вы никогда не пожалеете. Подсказка, фиксирующая эту ошибку компилятора: Используйте выражение лямбда. –

ответ

0

Вы должны мобилизовывать это обратно в поток пользовательского интерфейса:

public static void ListenOnSocket(Label lblstatus) 
{ 
    this.BeginInvoke(new Action(() => 
    { 
     //i want to change the label from here. 
     lblstatus.text = "Hello"; 
    }); 
} 
+0

Это решает проблему2, о которой я упоминал в своем комментарии ниже вопроса, но OP все еще не знает, как назвать это в потоке. Btw, если это единственный код в методе, OP не нуждается ни в каком потоке (я думаю, он еще раз взглянул на имя метода). –

0

Похоже, что вы могли бы на самом деле хотите ParameterizedThreadStart здесь. Вы должны передать метку в качестве параметра. Изменения контроля также должны выполняться в потоке пользовательского интерфейса.

public void DoSomething() 
    { 
     // Actually a ParameterizedThreadStart, but you don't need to state this explicitly 
     //var listenOnSocket = new Thread(new ParameterizedThreadStart(ListenOnSocket)); 
     var listenOnSocket = new Thread(ListenOnSocket); 

     // Pass the label as the ParameterizedThreadStart parameter 
     // TestLabel is a label within the form 
     listenOnSocket.Start(TestLabel); 
    } 

    private void ListenOnSocket(object statusLabelObject) // Parameter must be of type Object 
    { 
     var statusLabel = statusLabelObject as Label; 
     if (statusLabel == null) 
      throw new ArgumentException(@"Parameter must be of type Label", "statusLabelObject"); 

     // Changes to controls must be performed on the UI thread. 
     BeginInvoke((Action)(() => statusLabel.Text = @"text")); 
    } 
+0

В качестве опоры, есть некоторые любопытства по поводу самого вопроса. Действительно ли метка должна передаваться в качестве параметра методу ListenOnSocket? – planetarian

+0

Еще одна вещь. Должен ли этот метод быть статичным на первом месте? –

1

Вы можете использовать выражение Лямбда для передачи параметра.

Thread ListenOnSocket = new Thread(() => { Form1.ListenOnSocket(yourParameter); }); 
ListenOnSocket.Start(); 

Но вы получите CrossThreadException когда метод ListenOnSocket выполнения. Поэтому для установки текста меток вам необходимо использовать BeginInvoke.

Ищите CrossThreadException и почему вы его получите.

Примечание: я не пишу код примера для этого, потому что поиск более выгоден.

0

Ключи, полученные здесь, недействительны для обновления элемента пользовательского интерфейса (например, метки) из фонового потока.

Если у вас долго работающая задача, вы, вероятно, не захотите запускать ее в потоке пользовательского интерфейса, поскольку она будет блокироваться.

Предполагая, что вы создаете поток, потому что у вас есть что-то, что слишком долго запускается в потоке пользовательского интерфейса, возможно, стоит рассмотреть способ сортировки вызовов из фоновых потоков в поток пользовательского интерфейса.

Для получения дополнительной информации о том, как это сделать, см. How to update the GUI from another thread in C#?, если вы хотите обновить статус из долговременной задачи, вам может понадобиться посмотреть на рабочий стол: MSDN: How to Use Background Worker, который является вспомогательным классом, предназначенным для долгого использования фоновые задачи.

Смежные вопросы