C# web应用程序中多线程访问变量

C# web应用程序中多线程访问变量,c#,multithreading,webforms,C#,Multithreading,Webforms,我正在运行一个web表单,在该表单中,我按下按钮调用一个新线程来执行Rdotnet代码片段(我需要该线程,因为当前线程不断发送堆栈重载错误) 在Rdotnet函数中,我让它访问一个全局类变量并将数据放入其中。一旦函数完成并且button submit函数结束,我尝试通过另一个按钮单击(单独的按钮)来访问该全局类,但是它是空的。我假设线程结束,因此线程中的所有数据结束,所以我尝试返回类并将其放入buttonclick函数本身的全局变量中,结果相同 我需要帮助 public partial clas

我正在运行一个web表单,在该表单中,我按下按钮调用一个新线程来执行Rdotnet代码片段(我需要该线程,因为当前线程不断发送堆栈重载错误)

在Rdotnet函数中,我让它访问一个全局类变量并将数据放入其中。一旦函数完成并且button submit函数结束,我尝试通过另一个按钮单击(单独的按钮)来访问该全局类,但是它是空的。我假设线程结束,因此线程中的所有数据结束,所以我尝试返回类并将其放入buttonclick函数本身的全局变量中,结果相同

我需要帮助

public partial class BTForm : Page
{


    List<DirectorDetail> Details = new List<DirectorDetail>();
    BindingList<string> Test = new BindingList<string>();
    List<string> Line = new List<string>();
    List<string> output = new List<string>();
    WebDetails BTlibrary;




    OpenFileDialog ofd = new OpenFileDialog();
    List<string> Months = new List<string>();
    List<string> Year = new List<string>();
    BTBill Billfile = new BTBill();


    protected void Page_Load(object sender, EventArgs e)
    {


        if(!IsPostBack)
        {
            addMonth();
            addyear();
            foreach (var x in Months)
            {
                DropDownList1.Items.Add(x);
            }

            foreach (var y in Year)
            {
                DropDownList2.Items.Add(y);
            }
        }

        try
        {
            ListBox4.DataSource = Test;
            ListBox4.DataBind();

        }
        catch(Exception x)
        {
            Console.Write(x);
        }



    }

    protected void Submit_Click(object sender, EventArgs e)
    {

        Thread current = Thread.CurrentThread;

        WebDetails BTlibrary2 =BTlibrary;

        Thread t = new Thread(() => { BTlibrary2 = processes(BTlibrary2); }, 2500000);
        t.Start();
        t.Join();


        BTlibrary = BTlibrary2;
       // Thread.Sleep(10000);



    }



    public WebDetails processes(WebDetails library)
    {

        if (FileUpLoad1.HasFile)
        {
            string location = @"C:/BTBill/" + FileUpLoad1.FileName;
            Billfile.Tablename = FileUpLoad1.FileName;

            try

            {
                Billfile.Month = DropDownList1.SelectedItem.ToString();
                Billfile.Year = DropDownList2.SelectedItem.ToString();
                Billfile.Filename = Cleaning.PathCleaning(location);

                Billfile.Limit = TextBox3.Text.ToString();
                string fpath = Billfile.Month + " " + Billfile.Year + " Query " + "Limit -£ " + Billfile.Limit + "\\";
                string filename = Billfile.Month + " " + Billfile.Year + " Query " + "Limit -£ " + Billfile.Limit;

                Billfile.Savelocation = "//lonvmfs01/commonwealth_Data/BT BILL Alert/" + filename;
                Billfile.Sfilename = "//lonvmfs01/commonwealth_Data/BT BILL Alert/" + filename;

            }
            catch (Exception x)
            {
                Error1.Text = "Please Select Month and year\nERROR : " + x;
            }


            FileUpLoad1.SaveAs(@"C:\BTBill\" + FileUpLoad1.FileName);



            library = Executable.executable(Billfile);


            //  FileUpLoad1.
            //  = "File Uploaded: " + FileUpLoad1.FileName;
        }
        else
        {
            Label1.Text = "No File Uploaded.";
        }


        DataFrame Director = library.Director;
        DataFrame bill = library.Query;
        DataFrame limit = library.Btlim;


        int colcount = Director.RowCount;

        for (int x = 0; x < colcount; x++)
        {
            string cost_centre = Director[x, 0].ToString();
            string director = Director[x, 1].ToString();
            string email_address = Director[x, 2].ToString();
            double total = SendMail.calculatetotal(bill, limit, cost_centre);

            if (total > 0)
            {
                Line.Add(x + " )\t" + cost_centre + "\t" + director + "\t\t" + email_address + "\t" + total);
                Test.Add(x + " )\t" + cost_centre + "\t" + director + "\t\t" + email_address + "\t" + total);
            }


        }

        ListBox4.DataSource = Test;
        ListBox4.DataBind();


        //foreach (var x in getline().ToArray())
        // {
        //    ListBox4.Items.Add(x);
        // }

        //  ListBox4.DataBind();


        return library;
    }

    protected void Sendmail(object sender, EventArgs e)
    {


        DataFrame Director = BTlibrary.Director;
        DataFrame bill = BTlibrary.Query;
        DataFrame limit = BTlibrary.Btlim;


        string test;
        foreach (Object selecteditem in ListBox4.GetSelectedIndices() )
        {

            test = ListBox4.Items[(int)selecteditem].Text;
            System.Diagnostics.Debug.WriteLine(test);

            test = test.Substring(0, 1);
            output.Add(test);
        }

        List<int> index = new List<int>();

        for (int y = 0; y < output.Count; y++)
        {
            index.Add(Convert.ToInt32(output[y]));
        }


        for (int y = 0; y < index.Count; y++)
        {
            DirectorDetail temp = new DirectorDetail();
            temp.cost_centre = Director[index[y], 0].ToString();
            temp.director = Director[index[y], 1].ToString();
            temp.email_address = Director[index[y], 2].ToString();

            for (int count = 0; count < limit.RowCount; count++)
            {
                if (limit[count, 0].ToString() == temp.cost_centre)
                {
                    temp.limit = limit[count, 1].ToString();
                }
            }

            Details.Add(temp);

        }


        SendMail.Mailing(BTlibrary.Query, BTlibrary.Deplist, BTlibrary.Btlim, BTlibrary.Bill, Details);

        //Session["Details"] = Details;

        //  this.Close();

    }









    private void addyear()
    {

        DateTime time = System.DateTime.UtcNow;

        int baseyear = time.Year - 3;
        for (int x = baseyear; x < (baseyear + 10); x++)
        {
            Year.Add(x.ToString());
        }

    }



    // returns the list of years 
    public List<string> getYear()
    {
        return Year;
    }

    // returns the list of months 
    public List<String> getMonth()
    {
        return Months;
    }

    //adds months to a list
    private void addMonth()
    {


        Months.Add("January");
        Months.Add("February");
        Months.Add("March");
        Months.Add("April");
        Months.Add("May");
        Months.Add("June");
        Months.Add("July");
        Months.Add("August");
        Months.Add("September");
        Months.Add("October");
        Months.Add("November");
        Months.Add("December");


    }



    public List<string> getline()
    {
        return Line;
    }

}





 public static WebDetails executable(BTBill bill)
    {



        StartupParameter rinit = new StartupParameter();
        rinit.Quiet = true;
        rinit.RHome = @"C:\Program Files\R\R-3.4.4\";
        rinit.Home = @"C:\R";


        REngine.SetEnvironmentVariables();

        REngine engine = REngine.GetInstance(null,true,rinit);
        // engine.Initialize();

        //install and make connection to Postgres
        // engine.Evaluate("install.packages('RPostgreSQL') \n install.packages('gridExtra')");

        engine.Evaluate("require('RPostgreSQL')" + "\n" +
                        "pw <- {'admin'}" + "\n" +
                        "drv <- RPostgreSQL::PostgreSQL()" + "\n" +
                        "drv <- dbDriver('PostgreSQL')" +"\n"+
                        "con <- dbConnect(drv, dbname = 'postgres'," +"\n"+
                        "host = 'localhost', port = 5432," +"\n"+
                        "user = 'postgres', password = pw)");

        engine.Evaluate("postgresmfile<- dbGetQuery(con,'select * from masterfile')" + "\n" +
                        "Contact <- dbGetQuery(con, 'select * from contact')"+"\n"+
                        "btlim<- dbGetQuery(con, ' select * from bt_departmentlimit')"+"\n"+
                        "dbDisconnect(con)");

        engine.Evaluate("BTBill = read.csv(file<-'"+bill.Filename+"', header=TRUE, sep=',',skip=1)");




        // building dataframes and queries
        DataFrame BTBill = engine.Evaluate("BTBill").AsDataFrame(); 
        DataFrame MasterFile = engine.Evaluate("postgresmfile").AsDataFrame();
        DataFrame BTLim = engine.Evaluate("btlim").AsDataFrame();
        DataFrame Contact= engine.Evaluate("Contact ").AsDataFrame(); 
        DataFrame Query = engine.Evaluate("Merged <- merge(BTBill,postgresmfile,by.x='SERVICE.NO',by.y = 'service_number')" + "\n"+ "Merged_2 <- merge(Merged,Contact,by.x='cost_centre',by.y='cost_centre') " + "\n"+
           "query <- Merged_2[c('SERVICE.NO','username','cost_centre','job_post','USAGE.CHARGES','TOTAL.COST','USAGE.START.DATE','USAGE.END.DATE','director','email_address')]").AsDataFrame();
        DataFrame Merge2 = engine.Evaluate("Merged_2").AsDataFrame();

        DataFrame maillist = engine.Evaluate("data.frame(query)" +"\n"+
                "test <-subset(query, TOTAL.COST >= "+bill.Limit+ ", select = c(SERVICE.NO,username,cost_centre,job_post, TOTAL.COST, USAGE.START.DATE, USAGE.END.DATE,director,email_address,USAGE.CHARGES))").AsDataFrame();
        DataFrame DepList = engine.Evaluate("x<-test[c('cost_centre','director','email_address')]" + "\n" +
                                          "ux<-unique(x) ").AsDataFrame();

        DataFrame DepList2=engine.Evaluate("y <-query[c('cost_centre', 'director', 'email_address')]" + "\n" +
                                          "uy<-unique(y) ").AsDataFrame();

        engine.Evaluate("dir.create(file.path('" + bill.Savelocation + "'))");

        //creating pdf files for each department head 



        engine.Evaluate("write.csv(Merged_2, file = '" + bill.Savelocation + "/MasterFile.csv');");
        for (int count = 0; count < DepList.RowCount; count++)
        {
            DataFrame temp = engine.Evaluate("data.frame(query);" +
               "test2 <-subset(query, USAGE.CHARGES >= " + bill.Limit + " & cost_centre=='"+DepList[count,0]+"', select = c(SERVICE.NO,username,cost_centre,job_post, USAGE.CHARGES, USAGE.START.DATE, USAGE.END.DATE,director,email_address))").AsDataFrame();
            engine.Evaluate("library(gridExtra);");



          engine.Evaluate("pdf('" + bill.Sfilename +"/"+ DepList[count, 0] + ".pdf', height=20, width=20);"  );

            try
            {
                engine.Evaluate("grid.table(test2); dev.off() ;");
            }
            catch (Exception e)
            {

            }

        }


        SendMailForm form = new SendMailForm();


        WebDetails web = new WebDetails(DepList2, Query, BTLim);
        web.Deplist = DepList;
        web.Bill = bill;

        engine.Evaluate("write.csv(test, file = '" + bill.Savelocation + "/Users over threshold.csv')");

        engine.Dispose();

        return web;



        // form.Director=DepList2;
        //form.bill = Query;
        //form.limit = BTLim;

        List<DirectorDetail> output = form.Details;









        SendMail.Mailing(Query, DepList,BTLim, bill,output);
        // to filter by department 
        // DataFrame maillist = engine.Evaluate("data.frame(query)" + "\n" + 
        //         "test <-subset(query, TOTAL.COST >= " + bill.Limit + "& Cost.Centre=='"+bill.Dep+"', select = c(SERVICE.NO, User.Name, Cost.Centre, ROLE.JOB.POST, TOTAL.COST, USAGE.START.DATE, USAGE.END.DATE,DIRECTOR,EMAIL.ADDRESS))").AsDataFrame();


        //engine.Evaluate("install.package('dplyr')");








    }
}
公共部分类BTForm:第页
{
列表详细信息=新列表();
BindingList测试=新建BindingList();
列表行=新列表();
列表输出=新列表();
图书馆网页详情;
OpenFileDialog ofd=新建OpenFileDialog();
列表月份=新列表();
列表年份=新列表();
BTBill Billfile=新BTBill();
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(!IsPostBack)
{
addMonth();
addyear();
foreach(风险值x,以月为单位)
{
DropDownList1.Items.Add(x);
}
foreach(年变量y)
{
下拉列表2.项目。添加(y);
}
}
尝试
{
ListBox4.DataSource=测试;
ListBox4.DataBind();
}
捕获(异常x)
{
控制台。写入(x);
}
}
受保护的无效提交\u单击(对象发送者,事件参数e)
{
线程电流=Thread.CurrentThread;
WebDetails BTlibrary2=BTlibrary;
线程t=新线程(()=>{BTlibrary2=进程(BTlibrary2);},2500000);
t、 Start();
t、 Join();
BTlibrary=BTlibrary2;
//睡眠(10000);
}
公共WebDetails进程(WebDetails库)
{
if(FileUpLoad1.HasFile)
{
字符串位置=@“C:/BTBill/”+FileUpLoad1.FileName;
Tablename=FileUpLoad1.FileName;
尝试
{
Billfile.Month=DropDownList1.SelectedItem.ToString();
Billfile.Year=DropDownList2.SelectedItem.ToString();
Billfile.Filename=Cleaning.PathCleaning(位置);
Billfile.Limit=TextBox3.Text.ToString();
字符串fpath=Billfile.Month+“”+Billfile.Year+“查询”+“限额-£”+Billfile.Limit+“\\”;
字符串文件名=Billfile.Month+“”+Billfile.Year+“查询”+“限额-£”+Billfile.Limit;
Billfile.Savelocation=“//lonvmfs01/commonwealth_Data/BT BILL Alert/”+文件名;
Billfile.Sfilename=“//lonvmfs01/commonwealth_Data/BT BILL Alert/”+文件名;
}
捕获(异常x)
{
Error1.Text=“请选择月份和年份\n错误:+x;
}
FileUpLoad1.SaveAs(@“C:\BTBill\”+FileUpLoad1.FileName);
库=可执行文件。可执行文件(Billfile);
//文件上传1。
//=“上传文件:”+FileUpLoad1.FileName;
}
其他的
{
Label1.Text=“未上载任何文件。”;
}
DataFrame控制器=library.Director;
DataFrame bill=library.Query;
数据帧限制=library.Btlim;
int colcount=Director.RowCount;
对于(int x=0;x0)
{
行。添加(x+“”\t“+成本中心+“\t”+主管+“\t\t”+电子邮件地址+“\t”+总计);
测试。添加(x+“”\t“+成本中心+“\t”+主管+“\t\t”+电子邮件地址+“\t”+总计);
}
}
ListBox4.DataSource=测试;
ListBox4.DataBind();
//foreach(getline().ToArray()中的变量x)
// {
//列表框4.Items.Add(x);
// }
//ListBox4.DataBind();
返回库;
}
受保护的void Sendmail(对象发件人,事件参数e)
{
DataFrame控制器=BTlibrary.Director;
DataFrame bill=BTlibrary.Query;
数据帧限制=BTlibrary.Btlim;
串试验;
foreach(ListBox4.GetSelectedDices()中的对象selecteditem)
{
test=ListBox4.Items[(int)selecteditem].Text;
系统.诊断.调试.写线(测试);
测试=测试子串(0,1);
输出。添加(测试);
}
列表索引=新列表();
for(int y=0;yprotected void Submit_Click(object sender, EventArgs e)
    {

        Thread current = Thread.CurrentThread;

        WebDetails BTlibrary2 =BTlibrary;

        Thread t = new Thread(() => { BTlibrary2 = processes(BTlibrary2); }, 2500000);
        t.Start();
        t.Join();


        Session["BTLib"] = BTlibrary2;

       // Thread.Sleep(10000);



    }

protected void Sendmail(object sender, EventArgs e)
    {
        List<DirectorDetail> Details = new List<DirectorDetail>();

        BTlibrary = (WebDetails) Session["BTLib"];