异步接收数据和文件
首先请回顾一下如何接收上传的图片,参考:接收上传的文件
本节要完成同样的任务,不过文件和数据的接收部分要改为异步执行。
原代码中,用来生成AddNew.htm的代码非常简单,负荷极低,如果改为异步执行,创建和销毁线程的时间可能会长于生产网页的时间,得不偿失,所以这部分继续同步执行。
接收数据和文件的部分,负荷要重一些,所以我们改为异步执行。
需要注意的是,在异步函数中不能用AddNew增加给DataTable增加行,需要改用SQL语句增加行,Foxtable新版本的SQLCommand支持参数化,可以更加方便地 完成此类任务,参考:参数化SQLCommand
此外要注意,可能多个用户同时提交数据,且上传的文件名相同,如果多个子线程同时写一个文件,会因冲突而出错,我们可以在主线程用一个整数变量递增文件序号,或者用随机字符作为文件名,这也是我们本节采用的方法。
设计步骤:
1、新增一个自定义函数SaveData,代码为:
Dim
e As
RequestEventArgs =
args(0)
Dim
Name As
String = e.PostValues("姓名")
Dim
Xueli As
String = e.PostValues("学历")
Dim
Age As
Integer = Val(e.PostValues("年龄"))
Dim
Files As
String =
""
For
Each key
As String
In e.Files.Keys
If key
= "up1" Then
For Each
fln As
String In
e.Files(key)
'生成随机文件名,后缀名不变
Dim
newName As
String = rand.NextString(10)
& fln.SubString(fln.LastIndexOf("."))
e.SaveFile(key,
fln, ProjectPath
& "Attachments\"
& newName)
Files =
Files & IIF(Files
> "" , vbcrlf,
"") &
newName
Next
End
If
Next
Dim
cmd As
new
SQLCommand
cmd.ConnectionName
= "orders"
cmd.CommandText
= "Insert Into
员工
(姓名,
年龄,
学历,
照片)
Values(?,?,?,?)"
cmd.Parameters.Add("@姓名",Name)
cmd.Parameters.Add("@年龄",Age)
cmd.Parameters.Add("@学历",XueLi)
cmd.Parameters.Add("@照片",Files)
cmd.ExecuteNonQuery()
Dim
wb As
New
WeUI
With
wb.AddMsgPage("","msgpage","增加成功",
"好好学习,天天向上")
'生成成功提示页
.AddButton("btn1","继续增加","addnew.htm")
End
With
e.WriteString(wb.Build)
e.Handled
= True
'通知系统异步函数执行完毕,可以关闭信道
2、将HttpRequest事件代码改为:
Dim
wb As
New
weui
Select
Case e.Path
Case "addnew.htm"
If e.PostValues.Count
= 0 Then
wb.AddForm("","form1","addnew.htm")
With wb.AddInputGroup("form1","ipg1","增加员工")
.AddInput("姓名","姓名","Text")
'前一个"姓名"是ID,后一个"姓名"是标题
.AddInput("年龄","年龄","number")
.AddSelect("学历","学历","大专|本科|硕士|博士")
.AddUploader("up1","照片",True)
'True表示允许上传多个文件
End With
With
wb.AddButtonGroup("form1","btg1",True)
.Add("btn1",
"确定",
"submit")
End With
e.WriteString(wb.Build)
Else
e.AsyncExecute
= True
'通知系统异步执行,不要关闭信道
Functions.AsyncExecute("SaveData",e)
'异步调用函数
处理接收到的数据和文件
End
If
End
Select