WebService异步处理,Thread was being aborted

51Crack 2016-04-15 10:10:53
我提供WebService,因为调用的频率比较高(数据量大),对方要求调用后立即返回,不等待结果
现在使用BeginInvokeTask都会不定时出现Thread was being aborted
原因应该是后台线程未结束而前台主线程已结束,有什么办法解决?

WebService方法:

[WebMethod]
public string Data(string str)
{
ProcessData pd=new ProcessData();
return pd.Process(str);
}


其它类中方法:

public class ProcessData
{
string strData;
public string Process(string str)
{
strData=str;
Task task = new Task(ProcessTask);
task.Start();
return "ok"; //立即返回
}

void ProcessTask()
{
//处理
}
}
...全文
419 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
爱编 2017-03-17
  • 打赏
  • 举报
回复
楼主解决这个问题了吗?最近我也遇到这个问题了,system.timer 定时执行的方法里执行半小时后总是报这个错。和你一样的catch方法捕获到的。
51Crack 2016-04-18
  • 打赏
  • 举报
回复
微软提供了WebService异步方法,不过没毛用,还是卡在Begin...方法的}https://msdn.microsoft.com/en-us/library/98t3s469(v=vs.100).aspx
xiaogui340 2016-04-16
  • 打赏
  • 举报
回复
跟线程关系不大,应该是线程里面处理程序发生异常了。
51Crack 2016-04-15
  • 打赏
  • 举报
回复
引用 6 楼 starfd 的回复:
4.0不能直接await和async啊……
能用也不行,用await后WebService方法在最后的}等待处理完成才结束,这样也不是立即返回 [WebMethod] public string Data(string str) { ProcessData pd=new ProcessData(); return pd.Process(str); }
51Crack 2016-04-15
  • 打赏
  • 举报
回复
是的
  • 打赏
  • 举报
回复
4.0不能直接await和async啊……
51Crack 2016-04-15
  • 打赏
  • 举报
回复
.net 4.0环境
51Crack 2016-04-15
  • 打赏
  • 举报
回复
引用 3 楼 starfd 的回复:
直接返回Task<string>
不太明白,请详解
  • 打赏
  • 举报
回复
直接返回Task<string>
江南小鱼 2016-04-15
  • 打赏
  • 举报
回复
public class ProcessData
    {
        string strData;
        Task task;
        public string Process(string str)
        {
            strData = str;
            task = new Task(ProcessTask);
            task.Start();
            return "ok"; //立即返回
        }

        void ProcessTask()
        {
            //处理
        }
    }
江南小鱼 2016-04-15
  • 打赏
  • 举报
回复
主线程代码运行结束(webservice请求返回),task的生命周期结束了,把Task task声明为公有的。
51Crack 2016-04-15
  • 打赏
  • 举报
回复
处理过程最多1、2秒,应该被IIS回收导致,WebMethod返回了,Task线程在干活
51Crack 2016-04-15
  • 打赏
  • 举报
回复
引用 9 楼 starfd 的回复:
是对方只要服务器接收到就可以了,不用管实际执行进度,也不需要执行结果 重看了下问题,Thread was being aborted发生的原因很多,如果不是特别频繁,只是在特定的时间或者特定的时间范围内出现,那么很可能是IIS回收了,当然也有可能是你代码在程序里面报错了
对方调用的频率不固定,1秒钟对方可能调用10几20次,下1秒可能继续10几次(也可能间隔几秒或几分钟) 出错的频率不是很高,1天中可能10几次,出现的时间不固定(晚上居多),出错的地方不固定,有时在System.Data.SqlClient.CreateDbCommand这里,有时在反序列化的地方(这里最多),不是程序出错,我拦截了2种Exception,2个地方记录的日志不同,现在主要解决ThreadAbortException catch (System.Threading.ThreadAbortException ex) {} catch (Exception ex) {}
  • 打赏
  • 举报
回复
是对方只要服务器接收到就可以了,不用管实际执行进度,也不需要执行结果 重看了下问题,Thread was being aborted发生的原因很多,如果不是特别频繁,只是在特定的时间或者特定的时间范围内出现,那么很可能是IIS回收了,当然也有可能是你代码在程序里面报错了

110,526

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧