将方法传递给 BackgroundWorker.DoEvent C#

Passing a method to a BackgroundWorker.DoEvent C#

我目前正在尝试将常规函数 运行 作为匿名 BackgroundWorker 的 DoWork 事件。我遇到的问题是该方法根本不是 运行ning。我目前的代码如下;-

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();

如何传递方法并将其 运行 放在后台工作程序中?

从表面上看,您只是将操作本身作为结果分配,而不是调用它。

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();
    }
}