2015-07-28 3 views
0

если я поставил threadtest() в form1.cs, он будет работать правильно, но я хочу перейти в другой класс, он покажет ошибку. Это скриншот ошибкиКак обновить ярлык из другого класса C#

enter image description here

public partial class Form1 : Form 
{ 
    Thread thread; 
    bool loop = true; 
    volatile bool _cancelPending = false; 
    Stopwatch regularSW = new Stopwatch(); 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     thread = new Thread(new ThreadStart(() => threadtest())); 
     thread.Start(); 
    } 
    public void threadtest() 
    { 
     while (loop) 
     { 
      regularSW.Start(); 
      Thread.Sleep(5000); 
      regularSW.Stop(); 
      label1.Text = "Sleep in: " + regularSW.Elapsed + Environment.NewLine; 
     } 
    } 
} 
+4

Может быть, потому что 'label1' объявлена ​​в' Form1'? –

+0

Почему бы не использовать таймер для этого? .... –

ответ

2

Класс Form1 является фоновым кодом класса вашей формы окна. Метка с именем label1 не определена в Class1.

Можете ли вы использовать мероприятия?

Определите другой параметр, который вы можете обновить.

public event Action<string> onStatusChange; 
public void threadtest() 
{ 
    var status = ""; 
    while (loop) 
    { 
     regularSW.Start(); 
     Thread.Sleep(5000); 
     regularSW.Stop(); 
     if(null != onStatusChange) 
     { 
      onStatusChange("Sleep in: " + regularSW.Elapsed + Environment.NewLine); 
     }    
    } 
} 

В классе Form1:

var class1 = new Class1(); 
class1.onStatusChange += (status) => { label1.Text = status; }; 
class1.threadtest();  
+0

Как обновить метку со значением 'status' –

+1

Класс Form1 должен получить доступ к экземпляру Class1. – thomas

+0

... или использовать события, поскольку я изменил свой ответ, чтобы показать – thomas

-1

попытка ниже кода. В классе Form1 button1_Click добавить следующий код:

public partial class Form1 : Form 
{ 
    private void button1_Click(object sender, EventArgs e) 
    { 
    Class1 class1Object = new Class1(); 
    thread = new Thread(new ThreadStart(() => class1Object.threadtest(this))); 
    thread.Start(); 
    } 
} 

Теперь измените функцию class1 threadtest(), как показано ниже:

class Class1 
{ 
    public void threadtest(Form1 form) 
    { 
    while (loop) 
    { 
     regularSW.Start(); 
     Thread.Sleep(5000); 
     regularSW.Stop(); 
     form.label1.Text = "Sleep in: " + regularSW.Elapsed + Environment.NewLine; 
    } 
} 

} 
+0

Вы не можете обновить пользовательский интерфейс из отдельного потока ... используйте 'form.Invoke()'. Кроме того, вам придется изменить свойство «Модификаторы» для «label1», чтобы оно было видно за пределами класса Form1 ... –

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