Sending Report Loop (synchronous)

I have a pre-processor method directive (Ice.SysAgent.Update) that sends SO acknowledgement reports according to each customer. However, I’m running into errors when running it synchronously vs. asynchronously. It works fine when I set it to async. However, I need it to be synchronous because I have to update the Auto-Print Ready field to false in OrderHed after the report is sent. I am getting this error about it not being single threaded, provided below. Any ideas on how to get this to work?

// Get all orders with auto-print ready checked

var OrderHedTable =
from Order_Row in Db.OrderHed
where Order_Row.AutoPrintReady == true
select new { OrderNum = Order_Row.OrderNum, CustNum = Order_Row.CustNum };

if (OrderHedTable != null) {

// Loop through all auto-print ready orders
foreach (var row in OrderHedTable) {

  // Find email of customer
  var CustomerRow =
  	(from Customer_Row in Db.Customer
  	where Customer_Row.LegalName != "" && Customer_Row.CustNum == row.CustNum //Legal name holds my email address for testing
  	select Customer_Row).FirstOrDefault();

  if (CustomerRow != null) {

  // send email
  var soForm = Ice.Assemblies.ServiceRenderer.GetService<Erp.Contracts.SalesOrderAckSvcContract>(Db);
  SalesOrderAckTableset soTS = soForm.GetNewParameters();
  SalesOrderAckParamRow r = soTS.SalesOrderAckParam[0];

  r.OrderNum = (int)row.OrderNum;
  r.SysRowID = Guid.Parse("00000000-0000-0000-0000-000000000000");
  r.AutoAction = "SSRSPrint";
  r.AgentSchedNum = 0;
  r.AgentID = "SystemTaskAgent";
  r.AgentTaskNum = 0;
  r.RecurringTask = false;
  r.RptPageSettings = "";
  r.RptPrinterSettings = "";
  r.RptVersion = "";
  r.ReportStyleNum = 2;
  r.WorkstationID = "";
  r.TaskNote = "";
  r.ArchiveCode = 0;
  r.DateFormat = "m/d/yyyy";
  r.NumericFormat = ",.";
  r.AgentCompareString = "";
  r.ProcessID = "";
  r.ProcessTaskNum = 0;
  r.DecimalsGeneral = 0;
  r.DecimalsCost = 0;
  r.DecimalsPrice = 0;
  r.GlbDecimalsGeneral = 0;
  r.GlbDecimalsCost = 0;
  r.GlbDecimalsPrice = 0;
  r.FaxSubject = string.Format("Order: {0} The Sales Ack has been sent to you enjoy reading", (row.OrderNum)); 
  r.FaxTo = "";
  r.FaxNumber = "";
  r.EMailTo = CustomerRow.LegalName;
  r.EMailBody = "";

  r.AttachmentType = "PDF";
  r.ReportCurrencyCode = "USD";
  r.ReportCultureCode = "en-US";
  r.SSRSRenderFormat = "PDF";
  r.RowMod = "A";
  soForm.RunDirect(soTS);

  }

}
}

Business Layer Exception

Program Ice.Services.Lib.RunTask raised an unexpected exception with the following message: RunTask: The underlying provider failed on EnlistTransaction.
Stack Trace:
at System.Data.EntityClient.EntityConnection.EnlistTransaction(Transaction transaction)
at System.Data.Objects.ObjectContext.EnsureConnection()
at System.Data.Objects.ObjectQuery1.GetResults(Nullable1 forMergeOption)
at System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable1 source)
at System.Data.Objects.CompiledQuery.ExecuteQuery[TResult](ObjectContext context, Object parameterValues)
at Epicor.Data.DBExpressionCompiler.InvokeSingle[TContext,TQuery,TResult](Expression expression, Cache currentCacheSetting, Boolean cacheQuery, TContext context, Func2 getDataCacheKey, Func2 compileQuery, Func2 executeQuery) in c:\_Releases\ICE\3.1.400.17\source\Framework\Epicor.System\Data\DBExpressionCompiler.cs:line 261 at Epicor.Data.DBExpressionCompiler.<>c__DisplayClass1303.b__12c(TContext context, TArg1 arg1) in c:_Releases\ICE\3.1.400.17\source\Framework\Epicor.System\Data\DBExpressionCompiler.Generated.cs:line 1082
at Ice.Core.TaskBase1.KillTask() in c:\_Releases\ICE\3.1.400.17\source\Server\Internal\Lib\TaskLib\TaskBase\TaskBase.cs:line 67 at Ice.Core.TaskBase1.NoRecords(Boolean noRecordsFound) in c:_Releases\ICE\3.1.400.17\source\Server\Internal\Lib\TaskLib\TaskBase\TaskBase.cs:line 101
at Erp.Internal.OM.SalesOrderAck.RunProcess(Int64 instanceTaskNum, String outputFileName) in c:_Releases\ERP\RL10.1.400.0\Source\Server\Internal\OM\SalesOrderAck\SalesOrderAck.cs:line 585
at Ice.Hosting.TaskCaller.InnerExecuteTask(IceDataContext newContext) in c:_Releases\ICE\3.1.400.17\source\Framework\Epicor.Ice\Hosting\TaskCaller\TaskCaller.cs:line 78
at Ice.Hosting.TaskCaller.ExecuteTask(Boolean suppressTransaction) in c:_Releases\ICE\3.1.400.17\source\Framework\Epicor.Ice\Hosting\TaskCaller\TaskCaller.cs:line 41
at Ice.Lib.RunTask.BpmFriendlyTaskLauncher.Run(String sessionIdPrefix, IceContext db, Action taskRunner) in c:_Releases\ICE\3.1.400.17\source\Server\Services\Lib\RunTask\BpmFriendlyTaskLauncher.cs:line 63
at Ice.Services.Lib.RunTaskSvc.InnerRunTask(Int64 ipTaskNum, Boolean suppressTransaction) in c:_Releases\ICE\3.1.400.17\source\Server\Services\Lib\RunTask\RunTask.cs:line 502
Inner Exception:
The operation failed because the session is not single threaded.
Stack Trace:
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte buffer, TransactionManagerRequestType request, String transactionName, TransactionManagerIsolationLevel isoLevel, Int32 timeout, SqlInternalTransaction transaction, TdsParserStateObject stateObj, Boolean isDelegateControlRequest)
at System.Data.SqlClient.SqlInternalConnectionTds.PropagateTransactionCookie(Byte cookie)
at System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx)
at System.Data.SqlClient.SqlInternalConnection.Enlist(Transaction tx)
at System.Data.SqlClient.SqlInternalConnection.EnlistTransaction(Transaction transaction)
at System.Data.SqlClient.SqlConnection.EnlistTransaction(Transaction transaction)
at Epicor.Data.Provider.EpiConnection.EnlistTransaction(Transaction transaction) in c:_Releases\ICE\3.1.400.17\source\Framework\Epicor.System\Data\EpiProvider2\EpiConnection.cs:line 209
at System.Data.EntityClient.EntityConnection.EnlistTransaction(Transaction transaction)

Exception caught in: Epicor.ServiceModel

Error Detail

Description: Program Ice.Services.Lib.RunTask raised an unexpected exception with the following message: RunTask: The underlying provider failed on EnlistTransaction.
Stack Trace:
at System.Data.EntityClient.EntityConnection.EnlistTransaction(Transaction transaction)
at System.Data.Objects.ObjectContext.EnsureConnection()
at System.Data.Objects.ObjectQuery1.GetResults(Nullable1 forMergeOption)
at System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable1 source)
at System.Data.Objects.CompiledQuery.ExecuteQuery[TResult](ObjectContext context, Object parameterValues)
at Epicor.Data.DBExpressionCompiler.InvokeSingle[TContext,TQuery,TResult](Expression expression, Cache currentCacheSetting, Boolean cacheQuery, TContext context, Func2 getDataCacheKey, Func2 compileQuery, Func2 executeQuery) in c:\_Releases\ICE\3.1.400.17\source\Framework\Epicor.System\Data\DBExpressionCompiler.cs:line 261 at Epicor.Data.DBExpressionCompiler.<>c__DisplayClass1303.b__12c(TContext context, TArg1 arg1) in c:_Releases\ICE\3.1.400.17\source\Framework\Epicor.System\Data\DBExpressionCompiler.Generated.cs:line 1082
at Ice.Core.TaskBase1.KillTask() in c:\_Releases\ICE\3.1.400.17\source\Server\Internal\Lib\TaskLib\TaskBase\TaskBase.cs:line 67 at Ice.Core.TaskBase1.NoRecords(Boolean noRecordsFound) in c:_Releases\ICE\3.1.400.17\source\Server\Internal\Lib\TaskLib\TaskBase\TaskBase.cs:line 101
at Erp.Internal.OM.SalesOrderAck.RunProcess(Int64 instanceTaskNum, String outputFileName) in c:_Releases\ERP\RL10.1.400.0\Source\Server\Internal\OM\SalesOrderAck\SalesOrderAck.cs:line 585
at Ice.Hosting.TaskCaller.InnerExecuteTask(IceDataContext newContext) in c:_Releases\ICE\3.1.400.17\source\Framework\Epicor.Ice\Hosting\TaskCaller\TaskCaller.cs:line 78
at Ice.Hosting.TaskCaller.ExecuteTask(Boolean suppressTransaction) in c:_Releases\ICE\3.1.400.17\source\Framework\Epicor.Ice\Hosting\TaskCaller\TaskCaller.cs:line 41
at Ice.Lib.RunTask.BpmFriendlyTaskLauncher.Run(String sessionIdPrefix, IceContext db, Action taskRunner) in c:_Releases\ICE\3.1.400.17\source\Server\Services\Lib\RunTask\BpmFriendlyTaskLauncher.cs:line 63
at Ice.Services.Lib.RunTaskSvc.InnerRunTask(Int64 ipTaskNum, Boolean suppressTransaction) in c:_Releases\ICE\3.1.400.17\source\Server\Services\Lib\RunTask\RunTask.cs:line 502
Inner Exception:
The operation failed because the session is not single threaded.
Stack Trace:
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[] buffer, TransactionManagerRequestType request, String transactionName, TransactionManagerIsolationLevel isoLevel, Int32 timeout, SqlInternalTransaction transaction, TdsParserStateObject stateObj, Boolean isDelegateControlRequest) at System.Data.SqlClient.SqlInternalConnectionTds.PropagateTransactionCookie(Byte[] cookie) at System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx) at System.Data.SqlClient.SqlInternalConnection.Enlist(Transaction tx) at System.Data.SqlClient.SqlInternalConnection.EnlistTransaction(Transaction transaction) at System.Data.SqlClient.SqlConnection.EnlistTransaction(Transaction transaction) at Epicor.Data.Provider.EpiConnection.EnlistTransaction(Transaction transaction) in c:\_Releases\ICE\3.1.400.17\source\Framework\Epicor.System\Data\EpiProvider2\EpiConnection.cs:line 209 at System.Data.EntityClient.EntityConnection.EnlistTransaction(Transaction transaction) Program: Ice.Services.Lib.RunTask.dll Method: InnerRunTask Line Number: 502 Column Number: 25 Server Trace Stack: at Ice.Services.Lib.RunTaskSvc.InnerRunTask(Int64 ipTaskNum, Boolean suppressTransaction) in c:\_Releases\ICE\3.1.400.17\source\Server\Services\Lib\RunTask\RunTask.cs:line 502 at Ice.Services.Lib.RunTaskSvcFacade.RunTaskDirect(Int64 ipTaskNum) in c:\_Releases\ICE\3.1.400.17\source\Server\Services\Lib\RunTask\RunTaskSvcFacade.cs:line 113 at Ice.Core.TaskServiceBase1.InnerRunDirect(IceRow paramRow) in c:_Releases\ICE\3.1.400.17\source\Server\Internal\Lib\TaskLib\TaskBase\TaskServiceBase.cs:line 597
at Erp.Services.Rpt.SalesOrderAckSvc.RunDirect(SalesOrderAckTableset ds) in c:_Releases\ERP\RL10.1.400.0\Source\Server\Services\Rpt\SalesOrderAck\SalesOrderAck.Designer.cs:line 202
at Erp.Services.Rpt.SalesOrderAckSvcFacade.RunDirect(SalesOrderAckTableset ds) in c:_Releases\ERP\RL10.1.400.0\Source\Server\Services\Rpt\SalesOrderAck\SalesOrderAckSvcFacade.cs:line 215
at Epicor.Customization.Bpm.BOECDAFDEFA2E74DBD92650E18E8EA48E6.UpdatePreProcessingDirective_IL_SOAck_5F8FD70BBA404D7BA381CCE6AA8042FB.A001_CustomCodeAction()
at Epicor.Customization.Bpm.BOECDAFDEFA2E74DBD92650E18E8EA48E6.UpdatePreProcessingDirective_IL_SOAck_5F8FD70BBA404D7BA381CCE6AA8042FB.ExecuteCore()
at Epicor.Customization.Bpm.DirectiveBase3.Execute(TParam parameters) in c:\_Releases\ICE\3.1.400.17\source\Server\Internal\Lib\Epicor.Customization.BPM\DirectiveBase.Generic.cs:line 160 at Epicor.Customization.Bpm.MethodCustomizationBase23.<>c__DisplayClass30.b__27(MethodDirectiveBase3 dir) in c:\_Releases\ICE\3.1.400.17\source\Server\Internal\Lib\Epicor.Customization.BPM\MethodCustomizationBase2.cs:line 151 at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable1 source, Func2 predicate) at Epicor.Customization.Bpm.MethodCustomizationBase23.RunDirectives(TParam parameters) in c:_Releases\ICE\3.1.400.17\source\Server\Internal\Lib\Epicor.Customization.BPM\MethodCustomizationBase2.cs:line 153
at Epicor.Customization.Bpm.CustomizationBase23.Execute(TParam parameters) in c:\_Releases\ICE\3.1.400.17\source\Server\Internal\Lib\Epicor.Customization.BPM\CustomizationBase2.cs:line 77 at Epicor.Customization.Bpm.BOECDAFDEFA2E74DBD92650E18E8EA48E6.SysAgentSvcCustomization.Update(SysAgentTableset& ds) at Ice.Services.BO.SysAgentSvcFacade.Update(SysAgentTableset& ds) in c:\_Releases\ICE\3.1.400.17\source\Server\Services\BO\SysAgent\SysAgentSvcFacade.cs:line 241 at SyncInvokeUpdate(Object , Object[] , Object[] ) at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) at Epicor.Hosting.OperationBoundInvoker.InnerInvoke(Object instance, Func2 func) in c:_Releases\ICE\3.1.400.17\source\Framework\Epicor.System\Hosting\OperationBoundInvoker.cs:line 59
at Epicor.Hosting.OperationBoundInvoker.Invoke(Object instance, Func2 func) in c:\_Releases\ICE\3.1.400.17\source\Framework\Epicor.System\Hosting\OperationBoundInvoker.cs:line 28 at Epicor.Hosting.Wcf.EpiOperationInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) in c:\_Releases\ICE\3.1.400.17\source\Framework\Epicor.System\Hosting\Wcf\EpiOperationInvoker.cs:line 23 at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc) at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet) at System.ServiceModel.Dispatcher.ChannelHandler.DispatchAndReleasePump(RequestContext request, Boolean cleanThread, OperationContext currentOperationContext) at System.ServiceModel.Dispatcher.ChannelHandler.HandleRequest(RequestContext request, OperationContext currentOperationContext) at System.ServiceModel.Dispatcher.ChannelHandler.AsyncMessagePump(IAsyncResult result) at System.ServiceModel.Dispatcher.ChannelHandler.OnAsyncReceiveComplete(IAsyncResult result) at System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result) at System.Runtime.AsyncResult.Complete(Boolean completedSynchronously) at System.ServiceModel.Channels.SecurityChannelListener1.ReceiveItemAndVerifySecurityAsyncResult`2.InnerTryReceiveCompletedCallback(IAsyncResult result)
at System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result)
at System.Runtime.AsyncResult.Complete(Boolean completedSynchronously)
at System.ServiceModel.Channels.TransportDuplexSessionChannel.TryReceiveAsyncResult.OnReceive(IAsyncResult result)
at System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result)
at System.Runtime.AsyncResult.Complete(Boolean completedSynchronously)
at System.ServiceModel.Channels.SynchronizedMessageSource.ReceiveAsyncResult.OnReceiveComplete(Object state)
at System.ServiceModel.Channels.SessionConnectionReader.OnAsyncReadComplete(Object state)
at System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result)
at System.Net.LazyAsyncResult.Complete(IntPtr userToken)
at System.Net.LazyAsyncResult.ProtectedInvokeCallback(Object result, IntPtr userToken)
at System.Net.Security.NegotiateStream.ProcessFrameBody(Int32 readBytes, Byte buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.NegotiateStream.ReadCallback(AsyncProtocolRequest asyncRequest)
at System.Net.AsyncProtocolRequest.CompleteRequest(Int32 result)
at System.Net.FixedSizeReader.CheckCompletionBeforeNextRead(Int32 bytes)
at System.Net.FixedSizeReader.ReadCallback(IAsyncResult transportResult)
at System.Runtime.AsyncResult.Complete(Boolean completedSynchronously)
at System.ServiceModel.Channels.ConnectionStream.IOAsyncResult.OnAsyncIOComplete(Object state)
at System.Net.Sockets.SocketAsyncEventArgs.OnCompleted(SocketAsyncEventArgs e)
at System.Net.Sockets.SocketAsyncEventArgs.FinishOperationSuccess(SocketError socketError, Int32 bytesTransferred, SocketFlags flags)
at System.Net.Sockets.SocketAsyncEventArgs.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)

Client Stack Trace

at Epicor.ServiceModel.Channels.ImplBase1.ShouldRethrowNonRetryableException(Exception ex, DataSet[] dataSets) at Ice.Proxy.BO.SysAgentImpl.Update(SysAgentDataSet ds) at Ice.Adapters.SysAgentAdapter.OnUpdate() at Ice.Lib.Framework.EpiBaseAdapter.Update() at Ice.UI.App.SysAgentEntry.Transaction.adapterUpdate() at Ice.Lib.Framework.EpiMultiViewTransaction.Update(IEnumerable1 dataSets)

@inhol were you able to fix the error? I’m getting the same one and did some modifications to my code but I continue getting it.

Thanks

Anyone get anything on this? I don’t have an error but I have an automation I’d like to write synchronously (running PartBin QOH Refresh on one part at a time but based on a BAQ generating a long list of possible issue - want to make sure they’re updated before cycle counting).