【发布时间】:2015-10-07 04:24:15
【问题描述】:
我试图弄清楚我对 API 调用的请求是如何等待我的后台工作人员完成的。
这是我的工作经理:
public class JobManager {
public List<AbstractJob> Jobs;
public JobManager() {
Jobs = new List<AbstractJob>();
}
public int newTestJob() {
var job = new TestJob();
job.Name = "TestJob";
Jobs.Add(job);
return job.Id;
}
public void startJob(int id) {
var job = Jobs.Where(j => j.Id == id).FirstOrDefault();
if (job == null) throw new Exception("not found");
job.Execute();
}
public string statusJob(int id) {
var job = Jobs.Where(j => j.Id == id).FirstOrDefault();
if (job == null) throw new Exception("not found");
return job.Status;
}
public List<AbstractJob> runningJobs() {
return Jobs.Where(j => j.Status == "Running").ToList();
}
}
这是一个IJob
public interface IJob {
void Execute();
}
这是抽象作业
public abstract class AbstractJob : IJob {
static int counter = 0;
protected BackgroundWorker _bw = new BackgroundWorker();
public int Id;
public string Status;
public string Name;
public AbstractJob() {
Interlocked.Increment(ref counter);
Id = counter;
_bw.WorkerReportsProgress = true;
_bw.WorkerSupportsCancellation = true;
_bw.DoWork += new DoWorkEventHandler(bw_DoWork);
_bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
_bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
_bw.ReportProgress(0, "Idle");
}
public virtual string Describe() {
return "Not much is known about this four legged animal!";
}
public void Execute() {
_bw.RunWorkerAsync();
}
private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) {
this.Status = e.UserState.ToString();
}
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
BackgroundWorker worker = sender as BackgroundWorker;
if ((e.Cancelled == true)) {
this.Status = "Canceled";
} else if (!(e.Error == null)) {
this.Status = "Error";
} else {
this.Status = "Done";
}
}
public abstract void bw_DoWork(object sender, DoWorkEventArgs e);
}
并说这是我的工作:
public class TestJob : AbstractJob {
public override void bw_DoWork(object sender, DoWorkEventArgs e) {
System.Threading.Thread.Sleep(50000); // representing some actual code that takes time
}
}
所以我想在我的控制器中创建 10 个作业并在任务在后台运行时返回 ID。
public IEnumerable<int> Get() {
var ids = new List<int>();
for (int i = 0; i < 10; i++) {
var id = jobm.newTestJob();
jobm.startJob(id);
ids.Add(id);
}
return ids;
}
这一切似乎都很好,除了请求正在等待作业中的睡眠计时器。虽然当我在控制器中的return ids 上放置断点时;它的命中速度非常快(所以异步正在工作)
【问题讨论】:
标签: asp.net-web-api backgroundworker