从jquery调用async webmethod?

时间:2017-01-24 00:58:30

标签: jquery asp.net vb.net

我试图调用发送电子邮件的网络方法。我无法让它返回UI;我想我在这里的某个地方造成了僵局,但似乎无法解决它。

UI

 var email = { "ID": "someID", "Body": "whatever" };
                var json = '{tmpEmail:' + JSON.stringify(email) + '}';
 $.ajax({
                    type: "POST",
                    url: "send.aspx/SendMessage",
                    contentType: "application/json; charset=utf-8",
                    data: json,
                    dataType: "text",
                    success: function (output) {
                        alert('Message Sent')
                    },
                    error: function (output) {
                        alert('error');
                    }
                });

的WebMethod

 <WebMethod> _
<ScriptMethod(ResponseFormat:=ResponseFormat.Json)> _
    Public Shared Async Function SendMessage(tmpEmail As tmpEmail) As Threading.Tasks.Task(Of String)
    Dim _EmailID As Guid
    _EmailID = Await EmailFunctions.SendEmail(tmpEmail)
    Return "Hey it works"
End Function

SendMessage功能

Public Shared Async Function SendEmailLead(obj as tmpEmail) As Task(Of Guid)
 Dim PClient As New PostmarkDotNet.PostmarkClient(APIKey)
    Dim Result As PostmarkDotNet.PostmarkResponse = await PClient.SendMessageAsync(obj)
    If Result.Status = PostmarkDotNet.PostmarkStatus.Success Then
       ...
        Return LogID
    Else
        ... throw some exception
    End If
End Function

我在几分钟后无法让它返回呼叫者,当我停止调试时,从ajax呼叫中获取错误警告。

我试过了:

有人可以解释一下,为什么如果我一直使用得到结果它最终不会回到&#34;嘿它有效&#34;。

编辑/更新

经过进一步研究后,我可以通过以下更改来实现它:

  • 从用户界面正在调用的web方法中删除Async / Await。
  • 以非异步方式包装异步函数
  • 从原始webmethod
  • 调用包装函数

我不明白为什么会这样,这不会导致死锁吗?我明白它应该是async / await一直向下;但是,只有当它完全相反时,我才能让它工作。

附加问题:如果我已经登录该函数被调用是否有办法在其自己的线程中触发它并立即返回到UI?

0 个答案:

没有答案