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

loop abruptly stops when converting rtf to html via thread

我调试了 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");

我第一次运行它returns所有的记录。 然而,第二次,它停留在记录 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] DEBUG - Done

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 - return html text

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

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 方法再次启动...这是怎么回事?

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

例外情况:

303: The operation completed successfully

304: Not enough storage is available to process this command

305: The operation completed successfully

306: The operation completed successfully

.......

314: The operation completed successfully

现在应用程序没有挂了,但这是什么异常 这(操作成功完成)?我可以删除存储吗 有问题吗?