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

C# 通过线程将rtf转换为html时,循环突然停止,c#,thread-safety,single-threaded,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

我是在调试了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没有错误数据]…这可能是线程问题,但每次记录都应该不同

convertrftohtml

 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();
日志如下所示

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";
        }

    }

2017-08-03 12:14:38952[8]调试-完成

2017-08-03 12:14:38952[8]调试-302 SID:164 RID:44380 RTID:48

2017-08-03 12:14:38952[8]调试-ConvertRtfInSTAThread

2017-08-03 12:14:38952[8]调试-ConvertRtfThreadData

2017-08-03 12:14:38952[8]调试-SetApartmentState

2017-08-03 12:14:38956[8]调试-返回html文本

2017-08-03 12:14:38956[8]调试-完成

2017-08-03 12:14:38956[8]调试-303 SID:166 RID:44381 RTID:14

2017-08-03 12:14:38956[8]调试-ConvertRtfInSTAThread

2017-08-03 12:14:38956[8]调试-ConvertRtfThreadData

2017-08-03 12:14:38956[8]调试-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";
        }

    }

仍然没有记录异常,但是主操作方法再次启动…这是如何发生的?

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

例外情况:

303:操作已成功完成

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

305:操作已成功完成

306:操作已成功完成

314:操作已成功完成

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

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

例外情况:

303:操作已成功完成

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

305:操作已成功完成

306:操作已成功完成

314:操作已成功完成

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