我想在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不远。怎么了?
答案 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);
}
比较:
要获取结果信息,需要再次“查找”任务中的任务,否则它将为null。