Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么异步任务没有正确执行?_C#_Amazon Web Services - Fatal编程技术网

C# 为什么异步任务没有正确执行?

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

我有一个项目提交作业到AWS状态机和监测作业状态。因此,我实现了如下伪代码:

在main函数中调用两个任务:

       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);
}