通过线程将rtf转换为html时,循环突然停止

时间:2017-08-03 02:30:45

标签: c# thread-safety single-threaded

我在调试4天后问这个问题所以请耐心等待。 :)

我有413条记录的列表(评论列表)

logger.Debug("For each comment convert from rtf to Html: " + commentsList.Count().ToString());

int c = 1;
            foreach (var r in commentsList)
            {

                try
                {                        
                    r.NotesLong = ConvertRtfToHtml(r.NotesLong);
                    logger.Debug("Done");
                }
                catch (Exception e)
                {
                    logger.Error(e.Message);
                }
                finally {
                    logger.Debug(c.ToString() + " SID: " + r.StudentID.ToString() + " RID: " +r.ResultID.ToString() + " RTID: " + r.ResultTypeID.ToString());
                    c++;
                }

                if (r.Color == null)
                    r.Color = "FFFFFF";

            }

            logger.Debug("Completed notes long conversion");

我第一次运行它时会返回所有记录。 然而,第二次,它被卡在记录303(无论我尝试多少次在同一记录停止)。没有例外,但循环突然停止[记录303没有错误的数据] ..这可能是一个线程问题,但每次记录应该不同?

ConvertRtfToHtml

 public string ConvertRtfToHtml(string rtfText)
    {

        try
        {
            var thread = new Thread(ConvertRtfInSTAThread);
            logger.Debug("ConvertRtfInSTAThread");
            var threadData = new ConvertRtfThreadData { RtfText = rtfText };
            logger.Debug("ConvertRtfThreadData");
            thread.SetApartmentState(ApartmentState.STA);
            logger.Debug("SetApartmentState");
            thread.Start(threadData);
            thread.Join();
            logger.Debug("return html text");
            return threadData.HtmlText;

        }
        catch (Exception e){
            logger.Error("ConvertRtfToHtml: " + e.Message);
            return "Error";
        }

    }

在上面的代码中,出现了以下两行中的一些问题

            thread.Start(threadData);
            thread.Join();

日志如下

  

.........

     

2017-08-03 12:14:38,952 [8]调试 - 完成

     

2017-08-03 12:14:38,952 [8] DEBUG - 302 SID:164 RID:44380 RTID:48

     

2017-08-03 12:14:38,952 [8] DEBUG - ConvertRtfInSTAThread

     

2017-08-03 12:14:38,952 [8] DEBUG -ConvertRtfThreadData

     

2017-08-03 12:14:38,952 [8] DEBUG -SetApartmentState

     

2017-08-03 12:14:38,956 [8] DEBUG - 返回html文字

     

2017-08-03 12:14:38,956 [8]调试 - 完成

     

2017-08-03 12:14:38,956 [8] DEBUG - 303 SID:166 RID:44381 RTID:14

     

2017-08-03 12:14:38,956 [8] DEBUG - ConvertRtfInSTAThread

     

2017-08-03 12:14:38,956 [8] DEBUG - ConvertRtfThreadData

     

2017-08-03 12:14:38,956 [8] DEBUG -SetApartmentState

更新

问题发生在加入时。所以我改变了如下功能

public string ConvertRtfToHtml(string rtfText)
    {

        try
        {
            var thread = new Thread(ConvertRtfInSTAThread);                
            var threadData = new ConvertRtfThreadData { RtfText = rtfText };
            thread.SetApartmentState(ApartmentState.STA);
            logger.Debug("SetApartmentState");
            thread.Start(threadData);
            try
            {
                thread.Join();
            }
            catch(ThreadStateException e){
                logger.Error("ThreadStateException " + e.Message);
            }
            catch (ThreadInterruptedException e) {
                logger.Error("ThreadInterruptedException " + e.Message);
            }

            logger.Debug("return html text");
            return threadData.HtmlText;

        }
        catch (Exception e){
            logger.Error("ConvertRtfToHtml: " + e.Message);
            return "Error";
        }

    }

仍然没有记录异常,但主要的Action方法再次启动......这是怎么回事?

1 个答案:

答案 0 :(得分:0)

好!!我在ConvertRtfInSTAThread函数中添加了一个try / catch,并发现它在元素302之后开始抛出所有项目的异常,即在303及之后......

例外:

  

303:操作成功完成

     

304:没有足够的存储空间来处理此命令

     

305:操作成功完成

     

306:操作成功完成

.......

  

314:操作成功完成

现在没有应用程序挂起但是什么样的例外 这个(操作成功完成)?我可以删除存储空间吗? 问题