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. Web For Pentester靶场(xss部分)

    配置 官网:https://pentesterlab.com/ 下载地址:https://isos.pentesterlab.com/web_for_pentester_i386.iso 安装方法:虚 ...

  2. void operator()()的功能

    在学习多线程的时候看到这样的一段代码,为什么要重载()呢?真有这个必要吗? #include <iostream> #include <thread> class Counte ...

  3. 更优雅的在 Xunit 中使用依赖注入

    Xunit.DependencyInjection 7.0 发布了 Intro 上次我们已经介绍过一次大师的 Xunit.DependencyInjection https://www.cnblogs ...

  4. RAC环境上搭建DG

    首先RAC要确实是开归档的状态archive log list;如果是非归档状态,需要执行下面几步srvctl stop database -d +数据库实例名 关闭数据库--节点1(要做DG主库的) ...

  5. 【Python学习笔记六】获取百度搜索结果以及百度返回“百度安全验证”问题解决

    1.获取百度搜索结果页面主要是修改百度搜索url中的参数实现,例如查询的关键字为wd: 举例:https://www.baidu.com/s?wd=python",这样就可以查询到‘pyth ...

  6. 在docker中写个Hello World

    Hello World Docker 示例 准备hello.cpp #include<stdio.h> int main(){ printf("Hello World Docke ...

  7. JAVA集合三:几种Set框架

    参考链接: HOW2J.CN HashSet简单讲解 HashSet HashSet与C++STL中Set基本类似,具有的特点便是: 集合中元素不可重复 集合中元素顺序 ≠ 插入顺序 常用方法 功能 ...

  8. CentOS 7配置网卡信息,并设置yum为阿里云的镜像源

    一.问题场景 使用virtualbox创建的centos 7版本的linux虚拟机,使用ping mirrors.aliyun.com有返回,但是wget -O /etc/yum.repos.d/ep ...

  9. Linux中profile和bashrc的区别

    profile主要设置系统环境参数(可类比为Windows的系统环境变量),如$PATH /etc/profile ~/.bash_profile bashrc主要用来设置bash命令,如命令别名,a ...

  10. 数据库事务与MySQL事务总结

    事务特点:ACID 从业务角度出发,对数据库的一组操作要求保持4个特征: Atomicity(原子性):一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败 ...