C# ASP 异步存储数据
1.异步委托
在导航栏接收到提交的请求后,调用个各子画面的保存答案方法,之后实例化委托 saveToDB 。
当执行BeginInvoke后,服务器会另起线程执行saveToDB里的的方法,因为这里要保存的数据较多,所以要呈现下一个页面,
也就是:Response.Redirect("~/Default.aspx");调用后,画面虽然迁移了,后台还在执行saveToDB里的方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Threading;
using System.Threading.Tasks;
using System.Web.UI.HtmlControls;
using System.Drawing; public partial class SiteMaster : System.Web.UI.MasterPage
{
public delegate void ThreadHandler();//异步委托
BasePage currentPage = null;
protected void Page_Load(object sender, EventArgs e)
{
string strUrl = Request.Url.ToString(); if (strUrl.Contains("Questionnaire"))//只有在答题页面
{
currentPage = Page as BasePage;
}
} // 导航栏事件
protected void MenuMaster_MenuItemClick(object sender, MenuEventArgs e)
{
string strUrl = Request.Url.ToString(); Menu menu = (Menu)sender;
//提交问卷,所有答案入库
if (menu.SelectedValue == "SubmitAns")
{
if (strUrl.Contains("Questionnaire"))//只有在答题页面
{
int position_1 = strUrl.LastIndexOf("Questionnaire") + ;
int position_2 = strUrl.LastIndexOf(".");
string strCurrentNum = strUrl.Substring(position_1, position_2 - position_1);
int num = int.Parse(strCurrentNum); if (checkInput())//输入Check
{
return;
}
saveAnswer(num, true, false); AsyncCallback callback = new AsyncCallback(Callback); //回调函数声明
ThreadHandler ad = new ThreadHandler(saveToDB);//实例化委托类型
IAsyncResult ar = ad.BeginInvoke(callback, ad);//开始调用 }
Response.Redirect("~/Default.aspx");
}
} private bool checkInput()
{
return currentPage.checkInput();
} private bool saveAnswer(int num, bool isSubmit, bool isNext)
{
if (num == && !isSubmit && !isNext)
{
currentPage.saveAnswer();
Page.ClientScript.RegisterStartupScript(this.GetType(), "alert", "<script>alert('已经是第一道题');</script>");
return false;
}
else if (num == && !isSubmit && isNext)
{
currentPage.saveAnswer();
Page.ClientScript.RegisterStartupScript(this.GetType(), "alert", "<script>alert('已经是最后一道题');</script>");
return false;
}
else if (num == )
{
String className = (String)Request.Form.Get("className");
String authorName = (String)Request.Form.Get("authorName");
currentPage.saveAnswer(className, authorName);
}
else if (num == )
{
String projectName = (String)Request.Form.Get("projectName");
String DropDownList1 = (String)Request.Form.Get("ctl00$MainContent$DropDownList1");
String DropDownList2 = (String)Request.Form.Get("ctl00$MainContent$DropDownList2");
currentPage.saveAnswer(projectName, DropDownList1, DropDownList2);
}
else if (num == )
{
String Ctime = (String)Request.Form.Get("Ctime");
String Cname = (String)Request.Form.Get("Cname");
currentPage.saveAnswer(Ctime, Cname);
}
else
{
currentPage.saveAnswer();
}
return true;
} private void saveToDB()
{
UserInfo user = (UserInfo)Session["UserInfo"];
Answer answer = (Answer)Session["Answer"];
Dao dao = new Dao();//所有答案入库
lock (answer)
{
//Thread.Sleep(10000);
if (answer != null)
{
answer.Userid = user.Pkid;
if (user.Status == "")
{
dao.saveAnswer(answer);
}
else
{
dao.updateAnswer(answer);
}
dao.updateUser(user.Pkid.ToString(), "");
dao.ConvertToView(answer);
}
}
} /// <summary>
/// 回掉函数
/// </summary>
/// <param name="ar"></param>
void Callback(IAsyncResult ar)
{
ThreadHandler andl = (ThreadHandler)ar.AsyncState;
andl.EndInvoke(ar);
}
}
C# ASP 异步存储数据的更多相关文章
- python连接数据库异步存储
当同步写入数据库时,可能会发生下载速度很快,但是写入速度很慢的情况,因此我们采用异步存储写入数据库. 实现异步写入mysql数据库的思路: 1,将数据库的连接数据写入到settings文件中,供后面自 ...
- ASP模拟POST请求异步提交数据的方法
这篇文章主要介绍了ASP模拟POST请求异步提交数据的方法,本文使用MSXML2.SERVERXMLHTTP.3.0实现POST请求,需要的朋友可以参考下 有时需要获取远程网站的某些信息,而服务器又限 ...
- 微信小程序 路由跳转 异步请求 存储数据,微信登录接口
1小程序路由跳转 wx.switchTab(Object object) 这里的tabBar是底下的导航栏指定的页面 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面 tabBar l ...
- 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递
通过第一天的学习之后,我们相信您已经对MVC有一些基本了解. 本节所讲的内容是在上节的基础之上,因此需要确保您是否掌握了上一节的内容.本章的目标是在今天学习结束时利用最佳实践解决方案创建一个小型的MV ...
- 项目中使用的ajax异步读取数据结构设计
设计稍微复杂了一点,完成ajax读取功能涉及到了很多页面.虽然如此,但感觉比较灵活. 和传统方法唯一的区别在于多了一层数据容器控件,里面提供了显示数据的HTML元素及相应的JS方法. 这样数据控件指生 ...
- C# 实现的多线程异步Socket数据包接收器框架
转载自Csdn : http://blog.csdn.net/jubao_liang/article/details/4005438 几天前在博问中看到一个C# Socket问题,就想到笔者2004年 ...
- .net core2.0下使用Identity改用dapper存储数据
前言. 已经好多天没写博客了,鉴于空闲无聊之时又兴起想写写博客,也当是给自己做个笔记.过了这么些天,我的文笔还是依然那么烂就请多多谅解了.今天主要是分享一下在使用.net core2.0下的实际遇到的 ...
- vue 本地存储数据 sessionStorage
在vuex 下的 action下的userAction.js中添加 export function login(from, self) { axPost('/api/login', from, fun ...
- 获取异步API数据
异步操作应该是以前学习 ajax 时才被明确提及,就目前的理解,同步就是同一时间只能做一件事,如果使用 ajax同步模式,则代码会卡在 xhr.send() 这里,只有请求响应的过程全部完成了才会执行 ...
随机推荐
- 压缩并上传图片到阿里云(jfinal)
/** * 获取上传文件 * * @param r * @Return: com.oreilly.servlet.multipart.FilePart */public static FilePart ...
- Go的100天之旅-01初识Go
初识Go Go简介 Go的历史 上个世纪70年代Ken Thompson和Dennis M. Ritchie合作发明了UNIX操作系统同时Dennis M. Ritchie发明了C语言. 2007年的 ...
- Linux下一只五颜六色的「猫」
大家好,我是良许. 有使用过 Linux 系统的小伙伴,肯定会使用过 cat 这个命令.当然,在 Linux 下,此猫非彼猫,这里的 cat 并不代表猫,而是单词 concatenate 的缩写. c ...
- Java8之Stream 集合聚合操作集锦(含日常练习Demo)
Stream 是用函数式编程方式在集合类上进行复杂操作的工具,其集成了Java 8中的众多新特性之一的聚合操作,开发者可以更容易地使用Lambda表达式,并且更方便地实现对集合的查找.遍历.过滤以及常 ...
- row_number() over()排序功能说明
1.row_number() over()排序功能: (1) row_number() over()分组排序功能: 在使用 row_number() over()函数时候,over()里头的分组以及排 ...
- 【Python学习笔记二】开始学习啦!如何在IDEA中新建python文件
1.新建module 2.选择本地安装的python 3.右键新建的module,创建python file就可以开始编程了 4.有时候回出现无法识别python内建函数的问题,就是运行没 ...
- echarts 踩坑 : id必须不同
我们可能用react前端框架开发项目. 也就是组件化开发. 一个页面里可能有很多组件. 而echarts是寻找特定ID的DOM去渲染的. 也就是说,如果整个页面.包括所有页面组件,有id相同的DOM, ...
- 给咱的服务器安装BBR脚本
yum -y install wget ##ContOS Yum 安装 wget apt-get install wget ##Debian Ubuntu 安装 wget 先给咱的服务器安装wget, ...
- 题解 洛谷 P6378 【[PA2010]Riddle】
首先不难看出对于本题的点与点之间的限制关系,我们可以考虑用\(2-SAT\)来解决,通过从状态\(x\)向状态\(y\)连一条有向边表示若状态\(x\)存在,那么状态\(y\)必须存在. 接下来的处理 ...
- django 学习记录(一)
不使用 drf 来实现django 的 api 接口 json序列化 from django.shortcuts import render from django.views.generic.bas ...