将方法传递给BackgroundWorker.DoEvent C#

将方法传递给BackgroundWorker.DoEvent C#,c#,backgroundworker,C#,Backgroundworker,我目前正在尝试将一个常规函数作为匿名BackgroundWorker的DoWork事件运行。我遇到的问题是,该方法根本没有运行。我目前的代码如下:- public class Worker { BackgroundWorker worker; public Worker(Func<bool> action) { worker = new BackgroundWorker(); worker.DoWork += (sender,

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

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=新的BackgroundWorker();
worker.DoWork+=(发送方,e)=>e.结果=操作;
worker.RunWorkerCompleted+=worker\u RunWorkerCompleted;
这个动作=动作;
}
私有void Worker\u RunWorkerCompleted(对象发送方,RunWorkerCompletedEventArgs e)
{
WriteLine(“线程完成:+e.Result.ToString());
}
公共工作
{
WriteLine(“工作线程:工作…”);
worker.RunWorkerAsync();
//等待工人完成
做{}时(worker.IsBusy);
}
}
函数的传递方式如下:-

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

workerThread.Start();
Worker-workerObject=new-Worker(new-Func(()=>methodthatturnsbool(param1,param2));
线程工作线程=新线程(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();
    }
}
公共类工作者
{
私人背景工人;
私人自动重置事件;
私人职能行动;
公职人员(职能行动)
{
_行动=行动;
_事件=新的自动重置事件(假);
_worker=新的BackgroundWorker();
_worker.DoWork+=(发件人,e)=>
{
尝试
{
e、 结果=_action();
}
最后
{
_event.Set();
}
};
_worker.RunWorkerCompleted+=worker\u RunWorkerCompleted;
}
私有void Worker\u RunWorkerCompleted(对象发送方,RunWorkerCompletedEventArgs e)
{
WriteLine(“线程完成:+e.Result.ToString());
}
公共工作
{
WriteLine(“工作线程:工作…”);
_worker.RunWorkerAsync();
_event.WaitOne();
}
}

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

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();
    }
}
公共类工作者
{
私人背景工人;
私人自动重置事件;
私人职能行动;
公职人员(职能行动)
{
_行动=行动;
_事件=新的自动重置事件(假);
_worker=新的BackgroundWorker();
_worker.DoWork+=(发件人,e)=>
{
尝试
{
e、 结果=_action();
}
最后
{
_event.Set();
}
};
_worker.RunWorkerCompleted+=worker\u RunWorkerCompleted;
}
私有void Worker\u RunWorkerCompleted(对象发送方,RunWorkerCompletedEventArgs e)
{
WriteLine(“线程完成:+e.Result.ToString());
}
公共工作
{
WriteLine(“工作线程:工作…”);
_worker.RunWorkerAsync();
_event.WaitOne();
}
}

@mlg已经看到了这个问题。我试过这些建议,但都没用。因此,为什么我必须再次问这个问题。@mlg已经看到了这个问题。我试过这些建议,但都没用。因此,我为什么要再次提出这个问题。