尝试监视Azure Batch任务时获取``禁止对未绑定对象执行此操作''

时间:2019-06-11 12:58:48

标签: azure-batch

我想在Azure Batch中执行一个简单的任务,等待它完成并获取结果:

using (var client = _CreateBatchClient())
{
    var monitor = client.Utilities.CreateTaskStateMonitor();

    var task = new CloudTask(Guid.NewGuid().ToString(), "echo hello world");
    await client.JobOperations.AddTaskAsync("Test", task);
    await monitor.WhenAll(new List<CloudTask> { task }, TaskState.Completed, _timeout);

    var result = task.ExecutionInformation.Result;
}

然后WhenAsync行抛出System.InvalidOperationException: 'This operation is forbidden on unbound objects.'

该消息非常模糊,而我离tutorial不远。怎么了?

1 个答案:

答案 0 :(得分:1)

从此代码中看不出来,但实际上Azure Batch在这里不知道如何识别任务。该作业包含任务,但是任务没有对其运行的作业的引用。而且,任务ID并不能全局地识别任务,只需要在工作中唯一即可。

这可能是“未绑定对象”的含义。监视器只是不明白要看什么。实际上,如果在WhenAsync行中添加了注释,则下一行会抛出类似的InvalidOperationException: 'The property ExecutionInformation cannot be read while the object is in the Unbound state.'

所以正确的方法是通过作业引用任务:

using (var client = _CreateBatchClient())
{
    var monitor = client.Utilities.CreateTaskStateMonitor();

    var id = Guid.NewGuid().ToString();
    var taskToAdd = new CloudTask(id, "echo hello world");
    await client.JobOperations.AddTaskAsync("Test", taskToAdd);

    var taskToTrack = await client.JobOperations.GetTaskAsync("Test", id);
    await monitor.WhenAll(new List<CloudTask> { taskToTrack }, TaskState.Completed, _timeout);
}

比较:

task to add task to track

要获取结果信息,需要再次“查找”任务中的任务,否则它将为null。