将方法传递给BackgroundWorker.DoEvent C#
我目前正在尝试将一个常规函数作为匿名BackgroundWorker的DoWork事件运行。我遇到的问题是,该方法根本没有运行。我目前的代码如下:-将方法传递给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,
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已经看到了这个问题。我试过这些建议,但都没用。因此,我为什么要再次提出这个问题。