将方法传递给 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();
}
}
我目前正在尝试将常规函数 运行 作为匿名 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();
}
}