C#Thread Abort安全

时间:2015-06-18 14:47:13

标签: c# multithreading

使用

REGEX=example
sed -n "/$REGEX/{h};/^$/h;x;/$REGEX/{x;d};/$REGEX/"'!{x;p}' file

zone "foo.com" {
    type slave;
    file "db.foo.com";
    masters { x.x.x.x; };
};

在一个正在运行的线程中,调用thread.Abort()是否可以安全地运行以杀死该进程?

注意:这是后台工作者中的一个线程。我需要能够取消后台工作者,但如果那一行阻止

则不能

2 个答案:

答案 0 :(得分:1)

如果线程在非托管代码中被阻塞server { listen 80; server_name example.org; return 301 https://$server_name$request_uri; } server { listen 80; server_name www.example.org; return 301 https://$server_name$request_uri; } server { listen 443 ssl; ssl on; server_name example.org; root /var/www/soon; server_tokens off; ssl_certificate /etc/ssl/certs/example.org.certchain.crt; ssl_certificate_key /etc/ssl/private/example.org.key; ssl_session_cache shared:SSL:20m; ssl_session_timeout 10m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256; ssl_prefer_server_ciphers on; # HSTS add_header Strict-Transport-Security max-age=15768000; location /support/webmail/ { alias /var/www/webmail/; autoindex off; index index.php; location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; include /etc/nginx/fastcgi_params; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $request_filename; } } } 将无法执行任何操作,直到线程仍然返回到托管代码,您似乎已在注释中承认。

所以问题有点不清楚 - 调用Thread.Abort()本质上是安全的,因为它只会中止在托管代码中运行的线程。所以,当你说“安全”时,你担心的危险是什么?

如果您需要能够中止非托管调用,则可以在单独的进程中将其分离,以便您可以使用Process.Kill()。然后你就把处理清理工作的工作交给了操作系统。当然,您需要做一些样板代码来向过程发送数据。

答案 1 :(得分:0)

我认为没有人可以完全保证这一点,因为有很多非托管库可以通过数据库连接调用。

该服务的用户的最佳做法是处置与您的SQL连接相关的所有一次性对象,并且您应该是安全的。

只要所有一次性用品都处理得当,这里的流产就可以了。