/ / BackgroundWorker нитка для оновлення інтерфейсу WinForms - c #, багатопотокова редакція, winforms, інтерфейс користувача, backgroundworker

ThreadWorks Thread для оновлення WinForms інтерфейсу користувача - c #, багатопотоковий, winforms, користувальницький інтерфейс, фоновий редактор

Я намагаюся оновити мітку з потоку BackgroundWorker, який викликає метод з іншого класу поза формою. Тому я в основному хочу це зробити:

MainForm.counterLabel.Text = Counter.ToString();

але ярлик приватний. Я розглядав такі речі, як використання функції просування оновлення BackgroundWorker, виклик тощо, але вони, здається, не є тим, що мені потрібно.

ось ще декілька мого коду:

Основна форма:

clickThread.DoWork += (s, o) => { theClicker.Execute(speed); };
clickThread.RunWorkerAsync();

Клас / метод називається:

public void Execute(int speed)
{
while (running)
{
Thread.Sleep(speed);
Mouse.DoMouseClick();
Counter++;
//Update UI here
}
}

Я думаю, що я надто ускладнив свій код: і повернувся в кут.

Відповіді:

2 для відповіді № 1

Ви повинні використовувати ProgressChanged-Добре оновити інтерфейс користувача. Код для BackgroundWorker має виглядати приблизно так:

internal static void RunWorker()
{
int speed = 100;
BackgroundWorker clickThread = new BackgroundWorker
{
WorkerReportsProgress = true
};
clickThread.DoWork += ClickThreadOnDoWork;
clickThread.ProgressChanged += ClickThreadOnProgressChanged;
clickThread.RunWorkerAsync(speed);

}

private static void ClickThreadOnProgressChanged(object sender, ProgressChangedEventArgs e)
{

someLabel.Text = (string) e.UserState;

}

private static void ClickThreadOnDoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = (BackgroundWorker)sender;
int speed = (int) e.Argument;

while (!worker.CancellationPending)
{
Thread.Sleep(speed);
Mouse.DoMouseClick();
Counter++;
worker.ReportProgress(0, "newText-Parameter");
}
}

}


-3 для відповіді № 2

Спробуйте викликати метод.

Наприклад:-

this.Invoke((Action)(() => Resources.xobjMF.Enabled = true));