2016-04-28 3 views
0

В настоящее время я пытаюсь запустить обычную функцию как анонимное событие DoWork для BackgroundWorker. Проблема в том, что этот метод не работает вообще. Текущий код у меня выглядит следующим образом, -Передача метода BackgroundWorker.DoEvent C#

public class Worker 
{ 
    BackgroundWorker worker; 
    public Worker(Func<bool> action) 
    { 
     worker = new BackgroundWorker(); 
     worker.DoWork += (sender, e) => e.Result = action; 
     worker.RunWorkerCompleted += Worker_RunWorkerCompleted; 
     this.action = action; 
    } 

    private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     Console.WriteLine("Thread completed : "+ e.Result.ToString()); 
    } 

    public void DoWork() 
    { 
     Console.WriteLine("worker thread: working..."); 
     worker.RunWorkerAsync(); 
     //Wait for worker to complete 
     do { } while (worker.IsBusy); 
    } 
} 

функция передается следующим образом: -

Worker workerObject = new Worker(new Func<bool>(() => methodThatReturnsBool(param1, param2))); 
Thread workerThread = new Thread(workerObject.DoWork); 

workerThread.Start(); 

Как можно пройти метод и запустить его в фоновом режиме работника?

+0

http://stackoverflow.com/questions/3475263/passing-a -method-to-a-backgroundworker-dowork? rq = 1 – mlg

+0

@mlg Уже видел этот вопрос. Пробовал предложения, и они не сработали. Поэтому я снова задал вопрос. –

ответ

2

Из внешнего вида вы просто назначаете действие как результат, а не вызываете его.

worker.DoWork += (sender, e) => e.Result = action(); 

Также цикл ожидания может вызвать проблемы. По крайней мере, поставить

do {Thread.Yield();} while (worker.IsBusy); 

там

Или использовать пылесос (не занят, ожидающий) подход:

public class Worker 
{ 
    private BackgroundWorker _worker; 
    private AutoResetEvent _event; 
    private Func<bool> _action; 

    public Worker(Func<bool> action) 
    { 
     _action = action; 
     _event = new AutoResetEvent(false); 
     _worker = new BackgroundWorker(); 
     _worker.DoWork += (sender, e) => 
     { 
      try 
      { 
       e.Result = _action(); 
      } 
      finally 
      { 
       _event.Set(); 
      } 
     }; 
     _worker.RunWorkerCompleted += Worker_RunWorkerCompleted; 
    } 

    private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     Console.WriteLine("Thread completed : "+ e.Result.ToString()); 
    } 

    public void DoWork() 
    { 
     Console.WriteLine("worker thread: working..."); 
     _worker.RunWorkerAsync(); 
     _event.WaitOne(); 
    } 
} 
Смежные вопросы