【问题标题】:Passing a method to a BackgroundWorker.DoEvent C#将方法传递给 BackgroundWorker.DoEvent C#
【发布时间】:2016-04-28 19:44:51
【问题描述】:

我目前正在尝试将常规函数作为匿名 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 workerObject = new Worker(new Func<bool>(() => methodThatReturnsBool(param1, param2)));
Thread workerThread = new Thread(workerObject.DoWork);

workerThread.Start();

如何传递方法并让它在后台工作人员中运行?

【问题讨论】:

标签: c# backgroundworker


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2023-03-09
    • 2010-10-23
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多