早上好,我正在尝试用C#编写一些应用程序,我想从另一个线程和类更新UI(在这种情况下是一个进度条)。
但是我无法让它工作,我用Google搜索并搜索,但我担心我只是不明白。我有一个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);
}
}
}
答案 0 :(得分:0)
检查是否需要调用并且需要inf,然后使用控件Invoke函数:
public void UpdateProgressBar( int value)
{
if(progressBar1.InvokeRequired){
progressBar1.Invoke(new MethodInvoker(() => progressBar1.Value=value));
}else{
progressBar1.Value =value;
}
}
答案 1 :(得分:-1)
尝试从另一个类修改UI时,可以使用MethodInvoker:
ProgressBar progressBar = Form1.progressBar1;
MethodInvoker action = () => progressBar.Value = 80;
progressBar.BeginInvoke(action);
虽然你可以在另一个线程(例如Task
)中使用它时使用它:
progressBar1.Invoke((Action)(() => progressBar1.Value=50))
但请考虑您帖子中的评论。它不需要依赖于Forms
fileReader
旁注:我不知道你怎么没有在这里找到你的问题: