Asp.net web api WebApi中的后台工作人员

Asp.net web api WebApi中的后台工作人员,asp.net-web-api,backgroundworker,Asp.net Web Api,Backgroundworker,我试图弄清楚我对API调用的请求是如何等待我的后台工作人员完成的 这是我的工作经理: public class JobManager { public List<AbstractJob> Jobs; public JobManager() { Jobs = new List<AbstractJob>(); } public int newTestJob() { var job = new TestJob(); job.Name = "TestJob";

我试图弄清楚我对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();
}
}
这是一份抽象的工作

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;
}
public IEnumerable Get(){
var id=新列表();
对于(int i=0;i<10;i++){
var id=jobm.newTestJob();
jobm.startJob(id);
添加(id);
}
返回ID;
}

这一切似乎都很有效,只是请求正在等待作业中的睡眠计时器。虽然当我在控制器中的
返回id
上放置断点时;它的速度非常快(因此异步正在工作)

通常,您应该有以下信息: “异步模块或处理程序已完成,而异步操作仍处于挂起状态。”

您应该使用TaskParallelLibrary-async/await执行此操作,并正确等待所有任务返回:

 public async Task Get()
        {
            var tasks = new List<Task>();
            for (int i = 0; i < 10; i++)
            {
                tasks.Add(Task.Run(() =>
                {
                   //your code here
                }));
            }
            await Task.WhenAll(tasks);
        }
公共异步任务Get() { var tasks=新列表(); 对于(int i=0;i<10;i++) { tasks.Add(Task.Run)(()=> { //你的代码在这里 })); } 等待任务。何时(任务); } 如果您正在使用FireAndForget,则可以使用framework 4.5.2中的新版本


也看看这个。最好使用本机异步方法,并将整个链转换为异步,而不是简单地执行“Task.Run”。

谢谢,现在尝试另一种方法(通过windows服务和SQL表)
 public async Task Get()
        {
            var tasks = new List<Task>();
            for (int i = 0; i < 10; i++)
            {
                tasks.Add(Task.Run(() =>
                {
                   //your code here
                }));
            }
            await Task.WhenAll(tasks);
        }