在我的情况下,当我打开优化标志时,它不会完成所有操作,因此最终结果中缺少测量点,所以我只是关闭了优化标志来修复错误:
using System.Threading.Tasks;
Parallel.Invoke(
async () => await ProcessPartialArrayOperationAssets(operationAssets, 0, operationAssets.Count / 2,
operations, inspection1),
async () => await ProcessPartialArrayOperationAssets(operationAssets, operationAssets.Count / 2,
operationAssets.Count, operations, inspection1)
);
private async Task ProcessPartialArrayInspectionOperations(IList<InspectionOperation> operations,
int begin,
int end,
Inspection inspection,
InspectionAsset inspectionAsset)
{
await Task.Run(() =>
{
// create one new operation measuring point for each measuring point in the operation's equipment
int itemCounter = begin + 1;
for (int i = begin; i < end; i++)
{
lock (_thisLock)
{
InspectionOperation operation = operations[i];
int itemNumber = 1;
// get the asset
InspectionAsset operationAsset = operation.OperationAsset;
if (operationAsset != null)
{
// get the measuring points
string ABAPTrue = Abap.ABAP_TRUE;
lock (_thisLock)
{
IList<MeasuringPoint> measuringPoints = DbContext.MeasuringPoints.Where(x =>
x.AssetID == operationAsset.AssetID && x.InactiveFlag != ABAPTrue)
.ToList();
if (measuringPoints != null)
{
//Debug.WriteLine("measuringPoints.Count = " + measuringPoints.Count);
// create the operation measuring points
foreach (MeasuringPoint measuringPoint in measuringPoints)
{
OperationMeasuringPoint operationMeasuringPoint =
new OperationMeasuringPoint
{
InspectionID = inspection.InspectionID,
OperationNumber = operation.OperationNumber,
SubActivity = "",
RoutingNo = "",
ItemNumber = itemNumber.ToString("D4"),
// e.g. "0001", "0002" and so on
ItemCounter = itemCounter.ToString("D8"),
// e.g. "00000001", "00000002" and so on
MeasuringPointID = measuringPoint.MeasuringPointID,
MeasuringPointDescription = measuringPoint.Description,
Equipment = inspectionAsset.AssetID,
Category = "P"
};
DbContext.Entry(operationMeasuringPoint).State = EntityState.Added;
itemNumber++;
itemCounter++;
}
}
}
}
}
}
});
}
因此,我也用这个替换了 Parallel.Invoke 调用。仅供参考,使用 .NET Framework 4.7 时出现此问题。
await ProcessPartialArrayOperationAssets(operationAssets, 0, operationAssets.Count, operations, inspection1);
更新:
好的,我发现如果我从方法签名中删除async Task,我可以重新启用优化标志并使用Parallel.Invoke:
private void ProcessPartialArrayInspectionOperations(IList<InspectionOperation> operations,
int begin,
int end,
Inspection inspection,
InspectionAsset inspectionAsset)
{
// create one new operation measuring point for each measuring point in the operation's equipment
int itemCounter = begin + 1;
for (int i = begin; i < end; i++)
{
InspectionOperation operation = operations[i];
int itemNumber = 1;
// get the asset
InspectionAsset operationAsset = operation.OperationAsset;
if (operationAsset != null)
{
// get the measuring points
string ABAPTrue = Abap.ABAP_TRUE;
lock (_thisLock)
{
IList<MeasuringPoint> measuringPoints = DbContext.MeasuringPoints.Where(x =>
x.AssetID == operationAsset.AssetID && x.InactiveFlag != ABAPTrue)
.ToList();
if (measuringPoints != null)
{
//Debug.WriteLine("measuringPoints.Count = " + measuringPoints.Count);
// create the operation measuring points
foreach (MeasuringPoint measuringPoint in measuringPoints)
{
OperationMeasuringPoint operationMeasuringPoint =
new OperationMeasuringPoint
{
InspectionID = inspection.InspectionID,
OperationNumber = operation.OperationNumber,
SubActivity = "",
RoutingNo = "",
ItemNumber = itemNumber.ToString("D4"),
// e.g. "0001", "0002" and so on
ItemCounter = itemCounter.ToString("D8"),
// e.g. "00000001", "00000002" and so on
MeasuringPointID = measuringPoint.MeasuringPointID,
MeasuringPointDescription = measuringPoint.Description,
Equipment = inspectionAsset.AssetID,
Category = "P"
};
DbContext.Entry(operationMeasuringPoint).State = EntityState.Added;
itemNumber++;
itemCounter++;
}
}
}
}
}
}
Parallel.Invoke(
() => ProcessPartialArrayInspectionOperations(operations, 0, operations.Count / 2,
inspection1, inspectionAsset),
() => ProcessPartialArrayInspectionOperations(operations, operations.Count / 2,
operations.Count, inspection1, inspectionAsset)
);
或者,我认为我可以为每个使用Task.Run,然后等待Task.WhenAll(t1, t2, t3);,如此处所述,但在这种情况下,我没有进行显式数据库调用,所以我认为它不适用于使用Task.Run而不是 Parallel.Invoke 虽然这个页面确实解释了为什么我的 Parallel.Invoke 没有完成:Parallel.Invoke does not wait for async methods to complete
详情请看《C#中的并发》https://stephencleary.com/book/