Advertisement
yambroskin

Untitled

Aug 21st, 2018
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.87 KB | None | 0 0
  1.  using System;
  2. using System.Threading;
  3. using EleWise.ELMA.Logging;
  4. using EleWise.ELMA.Runtime.NH;
  5. using EleWise.ELMA.Security;
  6. using EleWise.ELMA.Security.Managers;
  7. using EleWise.ELMA.Services;
  8. using EleWise.ELMA.Threading;
  9.  
  10.   public static class ActionExtension
  11.     {
  12.         /// <summary>
  13.         /// Выполнить действие в отдельном потоке и транзакции
  14.         /// ---
  15.         ///  объекты должны быть независимы в действии, можно передавать Id сущности и после выполнения в исходном потоке вызвать Refresh
  16.         /// </summary>
  17.         /// <param name="action"> действие </param>
  18.         /// <param name="name">название операции</param>
  19.         /// <param name="errorCallback">обработка ошибки</param>
  20.         /// <param name="successCallback">действие после успеха</param>
  21.         /// <param name="minutes">количество минут выделенное на операцию (максимум 9)</param>
  22.         public static void InNewThread(
  23.             this Action action,
  24.             string name,
  25.             Action<Exception> errorCallback,
  26.             Action successCallback,
  27.             int minutes = 2)
  28.         {
  29.             Exception exception = null;
  30.             Thread thread = null;
  31.             try
  32.             {
  33.                 thread = ThreadStarter.StartNewThread((ThreadStart)delegate
  34.                 {
  35.                     var backgroundTask =  new BackgroundTask(() =>
  36.                     {
  37.                         var securityService = Locator.GetService<ISecurityService>();
  38.                         securityService?.RunByUser(UserManager.Instance.Load(SecurityConstants.AdminUserUid),
  39.                             () =>
  40.                             {
  41.                                 var unitOfWorkManager = Locator.GetServiceNotNull<IUnitOfWorkManager>();
  42.                                 using (var unitOfWork = unitOfWorkManager.Create(string.Empty, true, OrchardHelper.GetIsolationLevel()))
  43.                                 {
  44.                                     try
  45.                                     {
  46.                                         action.Invoke();
  47.                                         unitOfWork.Commit();
  48.                                     }
  49.                                     catch (Exception ex)
  50.                                     {
  51.                                         unitOfWork.Rollback();
  52.                                         exception = ex;
  53.                                     }
  54.  
  55.                                 }
  56.                             });
  57.                     }, typeof(Action), action?.Method.Name, name);
  58.                     backgroundTask.Execute();
  59.                 });
  60.                 thread.IsBackground = true;
  61.                 if (!thread.Join(TimeSpan.FromMinutes(minutes)))
  62.                 {
  63.                     thread.Abort();
  64.                     var message = $"Действие \"{name}\" выполнялось более {minutes} минут и было прервано";
  65.                     exception = exception != null ? new Exception(message, exception) : new Exception(message);
  66.                 }
  67.                 if (exception != null)
  68.                 {
  69.                     if (errorCallback != null)
  70.                     {
  71.                         errorCallback.Invoke(exception);
  72.                     }
  73.                     else
  74.                     {
  75.                         throw exception;
  76.                     }
  77.                 }
  78.                 else
  79.                 {
  80.                     successCallback.Invoke();
  81.                 }
  82.             }
  83.             catch (ThreadAbortException)
  84.             {
  85.                 thread?.Abort();
  86.                 throw;
  87.             }
  88.         }
  89.  
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement