2016-04-28 7 views
0

現在、匿名のBackgroundWorkerのDoWorkイベントとして実行される通常の関数を作成しようとしています。私が持っている問題は、メソッドがまったく実行されていないということです。次のように私が持っている現在のコードです; -メソッドを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

見た目からは、アクション自体を呼び出すのではなく、結果として割り当てるだけです。

また、待機ループによって問題が発生することがあります。少なくとも

そこに

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(); 
    } 
} 
関連する問題