首页 新闻 会员 周边 捐助

关于Abort线程时会报出“正在中止线程”的异常

0
悬赏园豆:30 [已解决问题] 解决于 2020-05-21 12:48

有什么办法解决这个异常吗? 最近做个项目发送短信中遇到这个异常。
现在暂时没法发图
代码如下:

private void send()
{
try
{
//SendSMSBase(this.user, this.pwd, this.mobile, this.msg);
WebClient webc = new WebClient();
string datastr = "userid=" + this.user_id + "&username=" + this.user_name + "&passwordMd5=" + this.pwd + "&mobile=" + this.mobile + "&message=" + System.Web.HttpUtility.UrlEncode(this.msg, System.Text.Encoding.GetEncoding("gbk"));
//webc.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
//byte[] res_by = webc.UploadData("http://139.129.107.160:8081/sendsms.php", "POST", System.Text.Encoding.UTF8.GetBytes(datastr));
//string res_str = System.Text.Encoding.UTF8.GetString(res_by);
//if (res_str.Contains("-"))
//{
// logger.Error("发送手机短消息接口返回错误!" + res_str);
//}
}

        catch (Exception ex)
        {
            logger.Error("发送手机短消息失败!" + ex.Message);
        }

        finally
        {
            try
            {
                if (t1.IsAlive)
                {
                    t1.Abort();
                }
            }
            catch (ThreadAbortException ex)
            {

            }
            catch (Exception eeee)
            {
                logger.Error("异常:" + eeee.Message);
                //throw eeee;
            }
        }
    }

public void SendMesPhone(string mobileGet, string msgGet)
{
// this.user = 100015002;
this.user_id = "100531";
this.user_name = "enetedu02";
//this.pwd = "!^v30&t1";
this.pwd = "55aa4312da4ed697";
this.mobile = mobileGet;
this.msg = msgGet;

        //ThreadPool.QueueUserWorkItem(new WaitCallback(send), null);
        t1 = new Thread(new ThreadStart(send));
        t1.Start();
       
    }
实力快递员的主页 实力快递员 | 初学一级 | 园豆:72
提问于:2019-05-08 13:24

建议提供相关代码

dudu 5年前

@dudu: 博客没有开通 暂时没法上传图片

实力快递员 5年前

@实力快递员: 博问支持 markdown 高亮语法

dudu 5年前

@dudu: 我重新贴出代码了 可以看下嘛

实力快递员 5年前

@实力快递员: 博问支持 github 的 markdown 语法

dudu 5年前

@实力快递员: 您用的是 .NET Framework 还是 .NET Core ?

dudu 5年前

@dudu: .NET Framework

实力快递员 5年前
< >
分享
最佳答案
0

在调用此方法的线程上引发 ThreadAbortException,以开始终止此线程的过程。 调用此方法通常会终止线程。
本意就是用抛出异常来终止线程, 可以try-catch下

Thread.Abort方法应谨慎使用。 尤其是当您调用它来中止当前线程以外的线程,您不知道哪些代码已执行或失败时要执行ThreadAbortException引发,也不能为特定的应用程序的状态或任何应用程序和用户的状态负责保留。 例如,调用Thread.Abort可能会阻止执行静态构造函数或阻止非托管资源的释放。
请注意,Thread.Abort在.NET Core 上不支持方法。

收获园豆:10
大志若愚 | 老鸟四级 |园豆:2138 | 2019-05-08 13:48

msdn上面的示例就不会引发异常了吗?

实力快递员 | 园豆:72 (初学一级) | 2019-05-08 14:15
其他回答(2)
0

建议使用 HostingEnvironment.QueueBackgroundWorkItem

收获园豆:10
dudu | 园豆:30778 (高人七级) | 2019-05-08 14:37

这个还真没用过呢

支持(0) 反对(0) 实力快递员 | 园豆:72 (初学一级) | 2019-05-08 14:39
0

不要用abort终止线程,可以设置个变量来判断是否跳出线程
执行到 finally后这个线程自己就结束了,不需要你在去判断手动abort
线程里的代码执行结束后这个线程也就结束了,除非有while等循环的语句卡在那作为等待操作或者阻塞类型的方法会一直等待

收获园豆:10
jqw2009 | 园豆:2341 (老鸟四级) | 2019-05-09 12:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册