我想在 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;
}
Run Code Online (Sandbox Code Playgroud)
还有WhenAsync线抛出System.InvalidOperationException: 'This operation is forbidden on unbound objects.'
该消息相当晦涩,而我距离教程并不远。怎么了?
从这段代码来看并不明显,但实际上 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);
}
Run Code Online (Sandbox Code Playgroud)
比较:
而要得到结果信息,就需要在作业中再次“查找”该任务,否则就会为空。
| 归档时间: |
|
| 查看次数: |
528 次 |
| 最近记录: |