异步接收数据和文件

首先请回顾一下如何接收上传的图片,参考:接收上传的文件

本节要完成同样的任务,不过文件和数据的接收部分要改为异步执行。

原代码中,用来生成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


本页地址:http://www.foxtable.com/mobilehelp/topics/0280.htm