Foxtable(狐表)用户栏目专家坐堂 → 在定时器TimeTick事件执行的自定义函数的网页代码,狐表来说是属于异步执行吗,需要添加e.Handel =true吗


  共有3663人关注过本帖树形打印复制链接

主题:在定时器TimeTick事件执行的自定义函数的网页代码,狐表来说是属于异步执行吗,需要添加e.Handel =true吗

帅哥哟,离线,有人找我吗?
chen37280600
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1279 积分:7953 威望:0 精华:4 注册:2017/12/31 14:53:00
在定时器TimeTick事件执行的自定义函数的网页代码,狐表来说是属于异步执行吗,需要添加e.Handel =true吗  发帖心情 Post By:2018/9/14 10:17:00 [显示全部帖子]

在HttpClient的异步编程里,写了

 

我们并不能简单地将HttpRequest事件中的代码转移到自定义函数中,然后在HttpRequest事件中用异步方式调用此函数就完事,因为默认主线程执行完毕,系统就会关闭和客户端的信道,客户端不会显示任何内容,同时因为信道已经关闭,异步函数向客户端发送信息的时候会出错

 

Dim e As RequestEventArgs = args(0)
'生成网页
'...
'发送网页

e
.Handled = True '通知系统异步函数执行完毕,可以关闭信道

 

我现在在定时器里增加一个每天晚上8点HttpClient发送json推送到用户的企业微信里,但是会发现出错,如果单纯执行代码就没错,但是在定制器8点的时候,会收到报错。好像是什么通讯突然中断,已关闭之类的 。我敢肯定是定制器里执行的代码报错。因为太准时了,8点0分0秒。连续测试过2天,都会这样!

 

1定时器里TimeTick的代码

Dim tc As WinForm.TextBox = e.Form.Controls("TextBox_CorpID")
If tc.Value <> "" Then
    static d1 As Date = Date.today.AddDays(-1)
    If d1 <> Date.today AndAlso Date.Now.Hour = 19 AndAlso Date.Now.Minute = 0 Then
        d1 = Date.today       
        Functions.Execute("AutoSendWhour")       
    End If  
   
End If

 

2自定义函数“AutoSendWhour”的代码:
Dim ur As String = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={0}"
Dim hc As new HttpClient(Cexp(ur,Functions.Execute("Web_GetQYAccessToken")))

Dim drs As List(of DataRow)= DataTables("MHuserInfo").SQLSe  lect("WXUserID is not null and MHUserName in (se  lect distinct WhourApproveUser from WhourInfo where WhourStatus =1)")

For Each dr As DataRow In drs
    Dim jo As New JObject
    Dim ja As New JArray

    Dim s As String = dr("WxUserID")
    jo("touser") = s
    jo("msgtype") = "news"
   
    Dim tb_AgentID As WinForm.TextBox = Forms("Mainform").Controls("TextBox_AgentID")
    s = tb_AgentID.Value
    jo("agentid") = s
    For i As Integer = 1 To 1 '可以一次发送最多8个图文消息,这里只发送了1个
        Dim ao As New JObject()
        Dim su As Integer = DataTables("WHourInfo").SQLCompute("Count(*)","WHourApproveUser ='" & dr("MHUserName") & "' And WhourStatus =1")
        s = "您有" & su & "条的工时申报未审核"
        ao("title") = s '标题
       
        ao("description") = "请及时审核工时申报,提高大家积极性" '描述
       
        Dim tb_http As WinForm.TextBox = Forms("Mainform").Controls("TextBox_Http")
        s = "http://" & tb_http.Value & "/WhourList.htm" '连接
        ao("url") =s
       
        ao("picurl") = "http://foxupdate.mbldt.com/MH13ServerUpdate/approve.jpg" '图片
        ja.Add(ao)
    Next
    jo("news") =  New JObject()
    jo("news")("articles") = ja
    hc.Content = jo.ToString()
    jo = JObject.Parse(hc.GetData)   
Next

 

是不是TimeTick执行的关于httpclient事件里,也要添加e.handle =true ,防止信道关闭?

[此贴子已经被作者于2018/10/30 10:04:56编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
chen37280600
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1279 积分:7953 威望:0 精华:4 注册:2017/12/31 14:53:00
  发帖心情 Post By:2018/9/14 10:50:00 [显示全部帖子]

那个是8点的,我今天特意改成7点,今晚再看看。基本也确定是这个timetick搞出来的

 

 

我这个不算是异步执行把?跟异步的帮助文档无关,是吧?

[此贴子已经被作者于2018/9/14 11:10:31编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
chen37280600
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1279 积分:7953 威望:0 精华:4 注册:2017/12/31 14:53:00
  发帖心情 Post By:2018/9/14 12:04:00 [显示全部帖子]

timetick不是多线程的吗?应该不会影响主线程的事情把?

 回到顶部
帅哥哟,离线,有人找我吗?
chen37280600
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1279 积分:7953 威望:0 精华:4 注册:2017/12/31 14:53:00
  发帖心情 Post By:2018/9/16 9:45:00 [显示全部帖子]

14和15号都报错了,我设置8点执行,2个晚上,都是同样时间的报错,肯定是timetick的问题

 

2018-09-15 20:00:31.9018
请求被中止: 连接被意外关闭。
   在 System.Net.ConnectStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   在 Foxtable.HttpClient.GetData(Boolean SkipError)

2018-09-15 20:00:31.9018
调用的目标发生了异常。
   在 System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
   在 System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
   在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
   在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   在 Foxtable.UserFunctions.Execute(String Name, Object[] Args)
Error reading JObject from JsonReader. Path '', line 0, position 0.
   在 Newtonsoft.Json.Linq.JObject.Load(JsonReader reader, JsonLoadSettings settings)
   在 Newtonsoft.Json.Linq.JObject.Parse(String json, JsonLoadSettings settings)
   在 Newtonsoft.Json.Linq.JObject.Parse(String json)
   在 UserCode.AQJ1sdBqZCKnjaL4L(Object[] Args)


 回到顶部
帅哥哟,离线,有人找我吗?
chen37280600
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1279 积分:7953 威望:0 精华:4 注册:2017/12/31 14:53:00
  发帖心情 Post By:2018/9/17 10:58:00 [显示全部帖子]

我想问下,timetick不是异步多线程的吗?我记得之前论坛里有人分享,通过timetick来实现了多线程统计查询。

 

那timetick实际是主线程的?自是多了一个定时运行的功能?


 回到顶部
帅哥哟,离线,有人找我吗?
chen37280600
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1279 积分:7953 威望:0 精华:4 注册:2017/12/31 14:53:00
  发帖心情 Post By:2018/10/30 9:26:00 [显示全部帖子]

我自己解决了,我发现问题在于httpClient使用一次后,就会被销毁,不能重复用,我的HttpClient放的位置不对

 

Dim ur As String = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={0}"
'删除Dim hc As new HttpClient(Cexp(ur,Functions.Execute("Web_GetQYAccessToken")))

Dim drs As List(of DataRow)= DataTables("MHuserInfo").SQLSe  lect("WXUserID is not null and MHUserName in (se  lect distinct WhourApproveUser from WhourInfo where WhourStatus =1)")

For Each dr As DataRow In drs

    '重新放这里Dim hc As new HttpClient(Cexp(ur,Functions.Execute("Web_GetQYAccessToken"))) 
    Dim jo As New JObject
    Dim ja As New JArray

    Dim s As String = dr("WxUserID")
    jo("touser") = s
    jo("msgtype") = "news"
   
    Dim tb_AgentID As WinForm.TextBox = Forms("Mainform").Controls("TextBox_AgentID")
    s = tb_AgentID.Value
    jo("agentid") = s
    For i As Integer = 1 To 1 '可以一次发送最多8个图文消息,这里只发送了1个
        Dim ao As New JObject()
        Dim su As Integer = DataTables("WHourInfo").SQLCompute("Count(*)","WHourApproveUser ='" & dr("MHUserName") & "' And WhourStatus =1")
        s = "您有" & su & "条的工时申报未审核"
        ao("title") = s '标题
       
        ao("description") = "请及时审核工时申报,提高大家积极性" '描述
       
        Dim tb_http As WinForm.TextBox = Forms("Mainform").Controls("TextBox_Http")
        s = "http://" & tb_http.Value & "/WhourList.htm" '连接
        ao("url") =s
       
        ao("picurl") = "http://foxupdate.mbldt.com/MH13ServerUpdate/approve.jpg" '图片
        ja.Add(ao)
    Next
    jo("news") =  New JObject()
    jo("news")("articles") = ja
    hc.Content = jo.ToString()
    jo = JObject.Parse(hc.GetData)   
Next


 回到顶部