【发布时间】:2017-04-11 14:17:20
【问题描述】:
大家早上好,我正在尝试用 C# 编写一些应用程序,我想从另一个线程和类更新 UI(在本例中为进度条)。
但我无法让它工作,我用谷歌搜索并四处搜索,但恐怕我就是不明白。我有一个 Windows 窗体应用程序,当我单击一个按钮时我会启动一个线程,并且我想在这个线程的某个地方更新我的 UI。
我要么得到: 非静态字段、方法或属性需要对象引用 或其他线程正在创建的对象方向上的东西。 (在我尝试在 fileReader 中调用 Form1.UpdateProgressBar(value); 的位置)。
我没有面向对象编程的经验,我通常坚持使用 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);
}
}
}
【问题讨论】:
-
您的 fileReader 类不是静态的,这就是为什么编译器说在调用它的构造函数之前需要对该类的引用。
-
这是一个糟糕的设计。
fileReader不应依赖于Forms。查看Task和IProgress<T>的用法以获得更好的进度通知。示例:blogs.msdn.microsoft.com/dotnet/2012/06/06/…
标签: c# multithreading winforms