public void PullValue(NodeDispatcher dispatcher) { if (dispatcher == Source.Dispatcher) { object value; if (!_values.TryTake(out value)) { value = SourcePin.GetValue(); } TargetPin.SetValue(value); } else { TargetPin.SetValue(_values.Take()); } }
public override async System.Threading.Tasks.Task GCode_CodeDom_GenerateCode(CodeTypeDeclaration codeClass, CodeStatementCollection codeStatementCollection, CodeGenerateSystem.Base.LinkPinControl element, CodeGenerateSystem.Base.GenerateCodeContext_Method context) { if (element == null || element == mCtrlMethodIn) { var param = CSParam as ClassCastControlConstructParam; var paramName = GCode_GetValueName(mCastResultPin, context); if (!mTargetPin.GetLinkedObject(0).IsOnlyReturnValue) { await mTargetPin.GetLinkedObject(0).GCode_CodeDom_GenerateCode(codeClass, codeStatementCollection, mTargetPin.GetLinkedPinControl(0), context); } if (!context.Method.Statements.Contains(mVariableDeclaration)) { mVariableDeclaration = new CodeVariableDeclarationStatement(param.ResultType, paramName, new CodePrimitiveExpression(null)); context.Method.Statements.Insert(0, mVariableDeclaration); } #region Debug // 收集用于调试的数据的代码 var debugCodes = CodeDomNode.BreakPoint.BeginMacrossDebugCodeStatments(codeStatementCollection); CodeDomNode.BreakPoint.GetGatherDataValueCodeStatement(debugCodes, TargetPin.GetLinkPinKeyName(), GCode_CodeDom_GetValue(mTargetPin, context), GCode_GetTypeString(mTargetPin, context), context); var breakCondStatement = CodeDomNode.BreakPoint.BreakCodeStatement(codeClass, debugCodes, HostNodesContainer.GUID, Id); CodeDomNode.BreakPoint.EndMacrossDebugCodeStatements(codeStatementCollection, debugCodes); #endregion var tryCatchStatement = new CodeTryCatchFinallyStatement(); codeStatementCollection.Add(tryCatchStatement); tryCatchStatement.TryStatements.Add(new CodeAssignStatement( new CodeVariableReferenceExpression(paramName), new CodeGenerateSystem.CodeDom.CodeCastExpression( param.ResultType, mTargetPin.GetLinkedObject(0).GCode_CodeDom_GetValue(mTargetPin.GetLinkedPinControl(0), context)))); var catchClause = new CodeCatchClause("catchException", new CodeTypeReference(typeof(System.Exception)), new CodeAssignStatement( new CodeVariableReferenceExpression(paramName), new CodePrimitiveExpression(null))); tryCatchStatement.CatchClauses.Add(catchClause); #region Debug // 转换之后收集一次数据 var debugCodesAfter = CodeDomNode.BreakPoint.BeginMacrossDebugCodeStatments(codeStatementCollection); CodeDomNode.BreakPoint.GetGatherDataValueCodeStatement(debugCodesAfter, CastResultPin.GetLinkPinKeyName(), GCode_CodeDom_GetValue(CastResultPin, context), GCode_GetTypeString(CastResultPin, context), context); CodeDomNode.BreakPoint.EndMacrossDebugCodeStatements(codeStatementCollection, debugCodesAfter); #endregion var condStatement = new CodeConditionStatement(); codeStatementCollection.Add(condStatement); condStatement.Condition = new CodeBinaryOperatorExpression( new CodeVariableReferenceExpression(paramName), CodeBinaryOperatorType.IdentityInequality, new CodePrimitiveExpression(null)); if (mCtrlMethodOut.HasLink) { await mCtrlMethodOut.GetLinkedObject(0).GCode_CodeDom_GenerateCode(codeClass, condStatement.TrueStatements, mCtrlMethodOut.GetLinkedPinControl(0), context); } if (mCastFailedPin.HasLink) { await mCastFailedPin.GetLinkedObject(0).GCode_CodeDom_GenerateCode(codeClass, condStatement.FalseStatements, mCastFailedPin.GetLinkedPinControl(0), context); } } else { throw new InvalidOperationException(); } }