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