2017-04-11 101 views
-1

早上好,我试图在C#中编写一些应用程序,我喜欢从另一个线程和类更新UI(这里是进度条)。C#从不同的类/线程更新UI

但我只是无法让它工作,我搜索了一下,但我恐怕我只是不明白。我有一个Windows窗体应用程序,当我点击一个按钮时,我开始一个线程,并且在这个线程中的某个地方我想更新我的UI。

我要么得到: 一个对象引用是所必需的非静态字段,方法或属性 或东西在物体的方向通过不同的线程被创建。 (在我尝试致电Form1.UpdateProgressBar(value); in fileReader的位置)。我没有经验的面向对象编程,我通常坚持C.如果有人能告诉我正确的方式来做到这一点,我会很高兴。

Edit_1:好吧..错误组合,如果我没有静态问题,那么到目前为止的答案可能会有所帮助。并且通过使整个类的静态固定的静态问题,对自己产生错误的另一个X量,包括:

静态类不能有实例构造

namespace TestCode 
{ 

    public partial class Form1 : Form 
    { 
    static fileReader SourceReader; 
    public Thread SearchThread { get; set; } 

    public Form1() 
    { 
     InitializeComponent(); 

    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     folderBrowserDialog1.ShowDialog(); 
     Console.WriteLine(folderBrowserDialog1.SelectedPath); 

     this.SearchThread = new Thread(new ThreadStart(this.ThreadProcSafe)); 
     this.SearchThread.Start(); 
    } 


    public void UpdateProgressBar(int value) 
    { 

     progressBar1.Value =value; 

    } 

    private void ThreadProcSafe() 
    { 
     SourceReader = new fileReader(folderBrowserDialog1.SelectedPath); 
    } 
    } 
} 

2类:

 namespace TestCode 
    { 
     class fileReader 
     { 

      public fileReader(String path) 
      { 
       int value = 20; 
       /*Do some stuff*/ 
        Form1.UpdateProgressBar(value); 

      } 

      } 

    } 
+0

您的fileReader类不是st atic这就是为什么编译器说你在调用它的构造函数之前需要对该类的引用。 –

+1

这是一个糟糕的设计。 'fileReader'不应该依赖于'Forms'。查看“Task”和“IProgress ”的用法以获得更好的进度通知。示例:https://blogs.msdn.microsoft.com/dotnet/2012/06/06/async-in-4-5-enabling-progress-and-cancellation-in-async-apis/ – user3185569

回答

-1

您可以使用MethodInvoker来尝试修改来自其他类的UI,如下所示:

ProgressBar progressBar = Form1.progressBar1; 
MethodInvoker action =() => progressBar.Value = 80; 
progressBar.BeginInvoke(action); 

,而你可以在不同的线程(例如Task)工作时,使用此:

progressBar1.Invoke((Action)(() => progressBar1.Value=50)) 

但考虑您的文章的评论。它并不需要依赖于FormsfileReader

附注:我不知道你怎么没在这里找到自己的问题:

how to update a windows form GUI from another class?

How to update the GUI from another thread in C#?

0

检查的invoke是必需的,需要inf然后使用控件调用功能:

public void UpdateProgressBar(int value) 
{ 
    if(progressBar1.InvokeRequired){ 
     progressBar1.Invoke(new MethodInvoker(() => progressBar1.Value=value)); 
    }else{ 
     progressBar1.Value =value; 
    } 
}