2013-03-29 2 views
1

Я пытаюсь запустить функцию в другом классе, чем диспетчер, с помощью фонового рабочего и обновить ее на каждой итерации. Я не подвожу никаких ошибок и BackgroundWorker работает правильно, но мое текстовое поле никогда не обновляет ...Обновление C# для выполнения рабочего процесса из отдельного класса

public partial class MainWindow : Window 
{ 
    public BackgroundWorker worker = new BackgroundWorker(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
     worker.WorkerReportsProgress = true; 
     worker.DoWork += new DoWorkEventHandler(workerDoWork); 
     worker.ProgressChanged += new ProgressChangedEventHandler(workerProgressChanged); 
    } 

    private void myButtonClick(object sender, RoutedEventArgs e) 
    { 
     worker.RunWorkerAsync(); 
    } 

    void workerDoWork(object sender, DoWorkEventArgs e) 
    { 
     yv_usfm.convert(worker); 
    } 

    void workerProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     myTextBox.Text = "some text"; 
    } 

} 

public class yv_usfm 
{ 
    public static void convert(BackgroundWorker worker) 
    { 
     int i = 1; 
     while (i < 100) 
     { 
      worker.ReportProgress(i); 
      i++; 
     } 
    } 
} 
+0

Если вы подумываете обновить прогресс «BackgroundWorker» из * другого * класса, вы неправильно поняли, что такое «BackgroundWorker». Я предлагаю вам использовать 'Task ' или пул потоков. –

+1

Я только что скопировал и запустил ваш код, и он отлично работает для меня ... – MisterXero

+0

Да, я понятия не имею, почему мое текстовое поле не обновляется – user1898657

ответ

-1

Попробуйте:

void DoWork(...) 
{ 
    YourMethod(); 
} 

void YourMethod() 
{ 
    if(yourControl.InvokeRequired) 
     yourControl.Invoke((Action)(() => YourMethod())); 
    else 
    { 
     //Access controls 
    } 
} 

Надежда Эта помощь.

+0

'BackgroundWorker.ProgressChanged' вызывается в потоке пользовательского интерфейса. Вам не нужно это делать. –

+2

@George Я просто хочу помочь этому парню, и я думаю, что мой ответ помогает этому парню. – Ansari

+2

@George Пожалуйста, прочитайте ответ Чарльза Магера ниже и прокомментируйте этот парень. – Ansari

0

Что заставляет вас сказать BackgroundWorker функционирует нормально? Я не вижу никакого звонка в worker.RunWorkerAsync(), и без этого он никогда не запустится.

+0

мой плохой, у меня он в моем коде, я просто не вложил в переполнение стека --__- – user1898657

0

Вы не начинаете рабочий!

worker.RunWorkerAsync(); 
+0

У меня есть это в моем коде, я просто идиотски забыл включить его в мой postoverflow post ... отредактировал – user1898657

+0

Я сделал свой собственный быстрый проект, копируя и вставляя ваш код, и как только я добавил 'RunWorkerAsync()' текстовое поле, обновленное просто отлично. Существуют ли какие-либо другие различия между вашим примером кода и проектом, над которым вы работаете? –

+0

В моем коде проекта у меня на самом деле есть 'worker.RunWorkerAsync();' нажатием кнопки, я обновил сообщение – user1898657

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