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 异步存储数据的更多相关文章

  1. python连接数据库异步存储

    当同步写入数据库时,可能会发生下载速度很快,但是写入速度很慢的情况,因此我们采用异步存储写入数据库. 实现异步写入mysql数据库的思路: 1,将数据库的连接数据写入到settings文件中,供后面自 ...

  2. ASP模拟POST请求异步提交数据的方法

    这篇文章主要介绍了ASP模拟POST请求异步提交数据的方法,本文使用MSXML2.SERVERXMLHTTP.3.0实现POST请求,需要的朋友可以参考下 有时需要获取远程网站的某些信息,而服务器又限 ...

  3. 微信小程序 路由跳转 异步请求 存储数据,微信登录接口

    1小程序路由跳转 wx.switchTab(Object object) 这里的tabBar是底下的导航栏指定的页面 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面 tabBar l ...

  4. 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递

    通过第一天的学习之后,我们相信您已经对MVC有一些基本了解. 本节所讲的内容是在上节的基础之上,因此需要确保您是否掌握了上一节的内容.本章的目标是在今天学习结束时利用最佳实践解决方案创建一个小型的MV ...

  5. 项目中使用的ajax异步读取数据结构设计

    设计稍微复杂了一点,完成ajax读取功能涉及到了很多页面.虽然如此,但感觉比较灵活. 和传统方法唯一的区别在于多了一层数据容器控件,里面提供了显示数据的HTML元素及相应的JS方法. 这样数据控件指生 ...

  6. C# 实现的多线程异步Socket数据包接收器框架

    转载自Csdn : http://blog.csdn.net/jubao_liang/article/details/4005438 几天前在博问中看到一个C# Socket问题,就想到笔者2004年 ...

  7. .net core2.0下使用Identity改用dapper存储数据

    前言. 已经好多天没写博客了,鉴于空闲无聊之时又兴起想写写博客,也当是给自己做个笔记.过了这么些天,我的文笔还是依然那么烂就请多多谅解了.今天主要是分享一下在使用.net core2.0下的实际遇到的 ...

  8. vue 本地存储数据 sessionStorage

    在vuex 下的 action下的userAction.js中添加 export function login(from, self) { axPost('/api/login', from, fun ...

  9. 获取异步API数据

    异步操作应该是以前学习 ajax 时才被明确提及,就目前的理解,同步就是同一时间只能做一件事,如果使用 ajax同步模式,则代码会卡在 xhr.send() 这里,只有请求响应的过程全部完成了才会执行 ...

随机推荐

  1. 使用recv函数和send函数的技巧

    一些述说 recv函数用于socket通信中接收消息,接口定义如下: int recv(SOCKET s, char *buf, int len, int flags) 参数一:指定接收端套接字描述符 ...

  2. pyhton 3.6 pip 出现 Fatal error in launcher: Unable to create process using 解决方法

    ERROR:Fatal error in launcher: Unable to create process using '"' 出现这个  打开  终端  输入 python36 -m ...

  3. Java应用服务器之tomcat会话复制集群配置

    会话是识别用户,跟踪用户访问行为的一个手段,通过cookie(存在客户端)或session(存在服务端)来判断本次请求是那个客户端发送过来:常用的会话保持有绑定会话,就是前边我们聊的在代理上通过算法或 ...

  4. 定长比较环状字符串-------strcat与strncpy的妙用

    题目链接:https://vjudge.net/problem/UVA-1584 题解:用strcpy与strcmp定长比较字符串即可,strcat与strcmp对string不适用,所以只能改写为c ...

  5. Python编程导论第2版|百度网盘免费下载|新手学习

    点击下方即可免费下载 百度网盘免费下载:Python编程导论第2版 提取码:18g5 豆瓣评论: 介绍: 本书基于MIT 编程思维培训讲义写成,主要目标在于帮助读者掌握并熟练使用各种计算技术,具备用计 ...

  6. 番外:socketserver用法

    进击のpython ***** 番外:socketserver使用 是不是被一般写法,多进程写法,多线程写法甚至是协程写法搞的不可开交 云里雾里,仿佛将要放弃~再配上服务器要服务多个客户端 完蛋了,全 ...

  7. 随机生成姓名&批量生成不重名

    # -*- coding: utf-8 -*- """ Created on Thu Jul 23 14:43:07 2020 @author: Administrato ...

  8. Jquery日历编写小练习

    日历练习 总体效果展示: 代码展示: 源代码部分 <body> <!-- 日历--> <div class="div_sty"> <tab ...

  9. IDEA 2020.1.2,IDEA 2020.1.3永久破解(持续更新)

    1. 本教程适用于 IntelliJ IDEA 2020.1.3 以下所有版本,请放心食用~2. 本教程适用于 JetBrains 全系列产品,包括 IDEA. Pycharm.WebStorm.Ph ...

  10. Day15_用户注册

    学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"乐优商城"获取视频和教程资料! b站在线视频 0.学习 ...