【问题标题】:thread was being aborted web service in Asp.Net线程在 Asp.Net 中被中止 Web 服务
【发布时间】:2016-06-21 12:12:26
【问题描述】:

在我的WebService 中,我有一个WebMethod。此方法包含一个foreach 循环,我在其中循环数千条记录并添加到Sitecore,然后写入日志。

[WebMethod(EnableSession = true)]
   public int Copy()
   {
     foreach (Item item in subItems)  //subitems are around 1L
      {
         CopyLanguage();
      }
   }

复制数据的代码(此方法中捕获的异常)

   private void CopyLanguage()
   {
      string message = "success";
      using (new SecurityDisabler())
      {
        try
        {
          //Copying Data
        }
        catch (Exception ex)
        {
           message = ex.Message;
        }
        finally
        {
         Log(message);
        }
      }
   }

复制数据

void Copy(Sitecore.Data.Items.Item item, Sitecore.Globalization.Language sourceLanguage,
             Sitecore.Globalization.Language targetLanguage)
        {
            //get a reference to the master DB
            Sitecore.Data.Database masterDB = Sitecore.Configuration.Factory.GetDatabase("master");

            Sitecore.Data.Items.Item targetItem = masterDB.Items[item.ID, targetLanguage];
            Sitecore.Data.Items.Item sourceItem = masterDB.Items[item.ID, sourceLanguage];

            if (targetItem == null || sourceItem == null || sourceItem.Versions.Count == 0)
                return;
            //Disable the security context
            using (new Sitecore.SecurityModel.SecurityDisabler())
            {
                try
                {
                    if (targetItem.Versions.Count == 0)
                    {
                  //add a version if none exist
                        targetItem = targetItem.Versions.AddVersion();
                    }
                    //edit item in target language
                    targetItem.Editing.BeginEdit();
                    sourceItem.Fields.ReadAll();
                    //copy over all fields from source to target language
                    //we omit internal fields which start with __
                    foreach (Sitecore.Data.Fields.Field field in sourceItem.Fields)
                    {
                        if (!field.Shared && !field.Name.StartsWith("__") && field.Name.Trim() != "")
                        {
                            targetItem.Fields[field.Name].SetValue(field.Value, true);
                        }
                    }

                    targetItem.Editing.EndEdit();
                    targetItem.Editing.AcceptChanges();
                }
                catch (Exception ex)
                {
                    targetItem.Editing.CancelEdit();
                }
            }

写入日志文件文件

private void Log(string message)
{
   // Writing Log to text file
}

日志文件正在打印“成功”,但一段时间后抛出错误

错误:

线程被中止

堆栈跟踪

System.Data.SqlClient.SqlParameter.set_SqlDbType(SqlDbType 值)
在 Sitecore.Data.SqlServer.SqlServerDataApi.CreateParameter(字符串 名称,对象值)在 Sitecore.Data.DataProviders.Sql.SqlDataApi.CreateCommand(字符串 sql, Object[] 参数)在 Sitecore.Data.DataProviders.Sql.SqlDataApi.c__DisplayClass12.b__10()

我在 Stackoverflow 中搜索并得到了这个 link。 在这里,我必须在服务本身中循环。

我已经通过设置尝试了第二个选项

<httpRuntime targetFramework="4.5.2" executionTimeout="600"/>

他没有帮助我。

有没有办法解决问题或在异常发生后继续循环

【问题讨论】:

  • 所以是在服务内部出错,而不是在调用服务的地方出错?
  • 你使用的是datareader还是dataset?
  • @riteshmeher 我已经简化了代码。这不是来自datareaderdataset,而是来自Sitecore
  • @Adam 是的,Service 抛出的错误和被调用的方法不知道发生了什么。
  • 为什么线程被中止?在 Web 应用程序或服务中,如果请求完成或发生超时,就会发生这种情况。 ` //Copying Data` 中的代码有什么作用?您是否正在启动任何未完成的后台任务?有任何async void 方法吗?

标签: c# asp.net web-services sitecore sitecore8


【解决方案1】:

ThreadAbortException 是一个特殊异常,它会在每个 catch 块结束时自动重新抛出,除非您调用 Thread.ResetAbort()。 尝试在 catch 块中调用 Thread.ResetAbort()

【讨论】:

  • 添加Thread.ResetAbort() 后,我没有收到error 但它已停止工作
  • 是的,在调用'ResrtAbort`方法后,感觉没有任何处理。
  • 不,它不是。如果你不使用 Thread.ResetAbort() .net 将在超过最大错误计数时抛出错误,你会捕获不抛出的错误。这个函数只是将当前错误计数设置为“0”线程。
  • 那你为什么认为我的foreach 循环在某个时间点后停止了(我觉得在捕获到异常并调用ResetAbort 之后)
  • for (int i = 0; i
猜你喜欢
  • 2020-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 2012-01-06
  • 1970-01-01
相关资源
最近更新 更多