如题
项目做到一半的时候发现用多线程后关闭浏览器后线程没有关闭,数据还在走,求高人指点

解决方案 »

  1.   

    asp.net的所谓多线程按正规做法应该不是用什么Thread.Start()之类的。它有他一套“多线程”的方法。什么PageTask之类的。
      

  2.   

    线程的话需要手动去控制,你可以在捕获页面的close事件中进行线程的强制关闭
      

  3.   

    PageTask这个没有接触过,可以给我一些资料吗?
      

  4.   

    应该怎么弄呢?现在要是重新用cs还来得及,但是我还是不甘心想用bs来解决,求高人指点
      

  5.   

    你可以在捕获页面的close事件中进行线程的强制关闭,就是进行对线程的的操作撒!有个方法可以关闭线程!
      

  6.   

    1.把线程的的IsBackground属性设为true;
    2.Application.ExitThread();
    3.遍历活动线程,挨个结束
      

  7.   

     还有 System.Environment.Exit(System.Environment.ExitCode);  
      System.Threading.Thread.CurrentThread.Abort(); 
       或者 Process.GetCurrentProcess().Kill() 
      

  8.   

    不好意思 没看见是webform
    Application.ExitThread()是winform中的
      

  9.   

    请问webform有比较可行的解决方案吗?
      

  10.   

    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Threading;
    using ZhongHeMgmt.DBUtility;
    using ZhongHeMgmt.Utility;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Data.SqlClient;
    using System.IO;public partial class Webs_deal_with_phone_iframe : System.Web.UI.Page
    {
        private static ZhongHeMgmt.DBUtility.DataBase db = new DataBase();
        private static string str_SQL = "";
        public string str_Sound_Table = "";
        public int getcurrentint = 0;
        Thread td_main;
        protected void Page_Load(object sender, EventArgs e)
        {
            td_main = new Thread(main);    
        }
            private void main()
        {
            while (Session["ready"].ToString() == "0")
            {            Thread.Sleep(1000);
                str_SQL = "insert into t_msg_log (port) select 1";
                db.RunExecuteNonQuery(str_SQL);        
            }
        }
    }
    这个是测试程序
      

  11.   

    B/S里玩多线程,重定向页面、刷新、关闭IE,线程都不会关闭。
      

  12.   

    <script type="text/javascript">var pb_strConfirmCloseMessage;var pb_blnCloseWindow = false;pb_strConfirmCloseMessage ="确实要离开该页面吗?!按“确定”继续,或按“取消”留在当前页面。"; function ConfirmClose() {window.event.returnValue = pb_strConfirmCloseMessage;pb_blnCloseWindow = true;}function ShowConfirmClose(blnValue) {if(blnValue) {document.body.onbeforeunload = ConfirmClose;} else {document.body.onbeforeunload = null;}}</script>////////<body onload="ShowConfirmClose(true)"><a href="http://www.baidu.com">换页面</a></body>////
    这个是关闭的事件
      

  13.   

    webform多线程有没有好的解决方案呢?能解决的我再加100分
      

  14.   

    那要看你的需求了,如果是非要用到多线程不存在别的思路,那还是C/S好一点。因为B/S的多线程,处理的好的很少见,起码我玩不转。但是我不否认可以用B/S实现,毕竟现在牛人太多了。但是这绝不是主流方法。
    之所以定位B/S、C/S,无非是因为它们各有所长,按需选择。不然还有必要分吗?
      

  15.   

    补充:就像那天有人在B/S里玩SOCKET一样,也行,就是我个人觉得有点无言
      

  16.   

    呵呵,那你就彻底不寻常吧。用B/S+C/S,中间在用SOCKET通讯,用B/S去控制C/S程序。C/S程序做成服务,在服务端自动启动侦听B/S的短信控制指令,然后C/S里多线程发送。OK了。
      

  17.   

    具体是怎么个流程?就是web页面发短信么?
      

  18.   

    webform中如果涉及到UI更新的多线程最好用BackgroundWorker这个来搞
    记得<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default"  Async="true" %>
    不然别用Thread,因为你无法跟踪它们,有异常它们不会自动关闭,除非关闭应用程序池
      

  19.   

    你可以把需要多线程的操作写入webservice,最后通过webform调用那个webservice
    推荐ThreadPool+WebService
      

  20.   

    而且程序要做成自动处理的,必须用while(ture)不断地提取数据进行发送
      

  21.   

    那就根据信息(登陆id之类的)做个状态字段,线程开始时设置一下,然后马上返回。线程结束时再修改那个字段。前台页面以后再根据那个字段显示。如果想做的像cs那样可以试试ajax
      

  22.   

    晕,没说明白
    程序里有一个函数是专门到数据库里取没有发送数据的,未发送的数据是别的程序产生的在不断的递增,如果不使用while(true)就没法领到最新的未处理数据,自动处理也就无从谈起了,使用了while(ture)不用多线程页面根本不能显示出来
      

  23.   

    up uphttp://www.thewebhappy.com