通过线程将 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
现在应用程序没有挂了,但这是什么异常
这(操作成功完成)?我可以删除存储吗
有问题吗?
我调试了 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
现在应用程序没有挂了,但这是什么异常 这(操作成功完成)?我可以删除存储吗 有问题吗?