C# 通过线程将rtf转换为html时,循环突然停止
我是在调试了4天后问这个问题的,所以请耐心听我说。:) 我有一个413条记录的列表(评论列表)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
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:操作已成功完成 现在没有挂起应用程序,但什么样的异常是 这(操作已成功完成)?我可以移除存储空间吗 有问题吗