C# 为什么异步任务没有正确执行?
我有一个项目提交作业到AWS状态机和监测作业状态。因此,我实现了如下伪代码: 在main函数中调用两个任务:C# 为什么异步任务没有正确执行?,c#,amazon-web-services,C#,Amazon Web Services,我有一个项目提交作业到AWS状态机和监测作业状态。因此,我实现了如下伪代码: 在main函数中调用两个任务: public static void Main(string[] args) { ExeJobs("1").Wait(); MonitorJobs().Wait(); } 在MonitoryJobs任务中,执行以下操作: public static asyn
public static void Main(string[] args)
{
ExeJobs("1").Wait();
MonitorJobs().Wait();
}
在MonitoryJobs任务中,执行以下操作:
public static async Task MonitorJobs()
{
int retry = 0;
for (int i = 0; i < retry; i++)
{
// Check History event here if find job id. else keep looping;
....
}
}
public static async Task ExeJobs(string jobId)
{
await SubmitJob(jobId);
ExecutionStatus status = ExecutionStatus.RUNNING;
while (status == ExecutionStatus.RUNNING)
{
status = await MonitorJobStaus(jobId);
}
}
我希望MonitorJobs是一个线程保持活动状态,直到我在运行ExeJobs时找到job执行状态。但是,在ExeJobs完成其whilestatus==ExecutionStatus.RUNNING循环之前,MonitorJobs任务似乎无法启动
我希望MonitorJobs可以在另一个任务的while循环期间运行,这应该是预期的结果,因为它们是两个线程
有人知道这里出了什么事吗?谢谢
等待将同步阻止,直到任务完成。那么现在
线程实际上被阻塞,等待任务完成。作为一个
一般来说,您应该一直使用异步;就是说,不要
异步代码上的块
等待将同步阻止,直到任务完成。那么现在
线程实际上被阻塞,等待任务完成。作为一个
一般来说,您应该一直使用异步;就是说,不要
异步代码上的块
等待将阻止,直到任务完成。此外,程序的行为将取决于异步任务中实际发生的情况。您可以使用使主方法异步:
这将启动两个任务,假设ExeJobs实际上是异步的,并等待两个任务都完成。等待将阻塞,直到任务完成。此外,程序的行为将取决于异步任务中实际发生的情况。您可以使用使主方法异步:
这将启动两个任务,假设ExeJobs实际上是异步的,并等待两个任务完成。因此,您需要了解,当您等待某项任务时,该范围内的执行将停止,直到任务完成。如果希望在不等待它完成的情况下继续执行,则需要将其分配给任务,然后可以等待它完成
public static async Task Main(string[] args)
{
// start ExeJobs task but don't wait for it to finish
var jobTasks = ExeJobs("1");
// start monitor task but don't wait for it to finish
var monitorTask = MonitorJobs();
// wait for both tasks to finish before returning
await Task.WhenAll(jobTasks, monitorTask);
}
因此,您需要了解,当您等待某项任务时,该范围内的执行将停止,直到任务完成。如果希望在不等待它完成的情况下继续执行,则需要将其分配给任务,然后可以等待它完成
public static async Task Main(string[] args)
{
// start ExeJobs task but don't wait for it to finish
var jobTasks = ExeJobs("1");
// start monitor task but don't wait for it to finish
var monitorTask = MonitorJobs();
// wait for both tasks to finish before returning
await Task.WhenAll(jobTasks, monitorTask);
}
首先,将MonitorJobs标记为async,但不等待显示的代码中的任何内容。我想你会得到警告的。我没有看到任何创建或启动线程的东西。为什么你希望在多个线程上运行呢?它们是两个线程,你怎么会这么想?仅仅因为某些东西是异步的,并不意味着你有两个线程。另外,您不能使主方法异步,这样就不必同步调用Wait吗?首先,您将MonitorJobs标记为异步,但不等待显示的代码中的任何内容。我想你会得到警告的。我没有看到任何创建或启动线程的东西。为什么你希望在多个线程上运行呢?它们是两个线程,你怎么会这么想?仅仅因为某些东西是异步的,并不意味着你有两个线程。另外,您不能使Main方法异步,这样就不必同步调用Wait吗?该引号的源为Wait,也将停止处理,直到ExeJobs完成。该引号的源为Wait,也将停止处理,直到ExeJobs完成。
public static async Task Main(string[] args)
{
// start ExeJobs task but don't wait for it to finish
var jobTasks = ExeJobs("1");
// start monitor task but don't wait for it to finish
var monitorTask = MonitorJobs();
// wait for both tasks to finish before returning
await Task.WhenAll(jobTasks, monitorTask);
}