private void DoSendTransactionCompleted(SendTxPackage aDataPackage, string aErrorMsg, string aTxId) { try { this.SynchronizingObject?.BeginInvoke(aDataPackage.CompletedEvent, new object[] { this, aErrorMsg, aTxId }); if (aTxId != null) { this.SynchronizingObject?.Invoke(OnSentTransaction, new object[] { this, aDataPackage.TransactionData, aTxId, aDataPackage.CurrencyId, aDataPackage.StartTime, DateTime.Now }); } } catch (Exception e) { DoErrorHandler(e); } }
private void ThreadSendTransaction(SendTxPackage aDataPackage) { string lTxId = null; if (Terminated) { return; } try { if (aDataPackage.SendHandle == 0) { Log.Write(LogLevel.Debug, "Sending transaction for {0}", aDataPackage.CurrencyId); aDataPackage.SendHandle = FServerAccess.SendTransaction(aDataPackage.CurrencyId, aDataPackage.TransactionData); // resend the message in the loop BeginInvoke(new DelegateThreadSendTransaction(ThreadSendTransaction), aDataPackage); } else { if (aDataPackage.NextRequestTime < DateTime.Now) { try { aDataPackage.NextRequestTime = DateTime.Now.AddMilliseconds(RandomNumber(500, 1000)); if (FServerAccess.IsTransactionSent(aDataPackage.SendHandle)) { lTxId = FServerAccess.GetTransactionId(aDataPackage.SendHandle); } } catch (Exception ex) { aDataPackage.ErrorCount++; Log.Write(LogLevel.Critical, "Error getting send result {0} - {1}", ex.Message, ex.StackTrace); if (aDataPackage.ErrorCount > 20 || ex is PandoraServerException) // retried 20 times for 20 secs so its dead. { throw; } Thread.Sleep(1000); } } else { Thread.Sleep(100); } if (lTxId == null) { BeginInvoke(new DelegateThreadSendTransaction(ThreadSendTransaction), aDataPackage); } else { if (IsByteArray(lTxId)) { DoSendTransactionCompleted(aDataPackage, "", lTxId); } else { DoSendTransactionCompleted(aDataPackage, lTxId, ""); } } } } catch (Exception e) { DoSendTransactionCompleted(aDataPackage, e.Message, ""); DoErrorHandler(e); } }