【发布时间】:2013-07-04 06:18:30
【问题描述】:
我使用的是 SignalR 1.1.2,但异步集线器方法有问题。使用 ForeverFrame 传输在我的 PC 上一切正常,但在服务器上部署并切换到 Web 套接字传输后,我收到以下错误:
此时无法启动异步操作。异步操作只能在异步处理程序或模块内或在页面生命周期中的某些事件期间启动。如果在执行 Page 时发生此异常,请确保将 Page 标记为 。
我的hub方法代码:
public async Task<string> getUrl()
{
var url = await MyWebservice.GetMyRoomUrlAsync(Context.User.Identity.Name);
return url;
}
SignalR 中是否支持带有网络套接字传输的异步方法?
更新: GetMyRoomUrlAsync 代码:
public static Task<string> GetMyRoomUrlAsync(string email)
{
var tcs = new TaskCompletionSource<string>();
var client = new Onif40.VisualStudioGeneratedSoapClient();
client.GetRoomUrlCompleted += (s, e) =>
{
if (e.Error != null)
tcs.TrySetException(e.Error);
else if (e.Cancelled)
tcs.TrySetCanceled();
else
tcs.TrySetResult(e.Result);
};
client.GetRoomUrlAsync(email);
return tcs.Task;
}
在 Stephen Cleary 向我澄清问题出在哪里后,通过将 EAP 重写为 APM 来解决问题是微不足道的。
public static Task<string> GetMyRoomUrlAsync(string email)
{
var tcs = new TaskCompletionSource<string>();
var client = new Onif40.VisualStudioGeneratedSoapClient();
client.BeginGetRoomUrl(email, iar =>
{
try
{
tcs.TrySetResult(client.EndGetRoomUrl(iar));
}
catch (Exception e)
{
tcs.TrySetException(e);
}
}, null);
return tcs.Task;
}
【问题讨论】:
-
很抱歉问你一件事。我知道 EAP 是指基于事件的异步模式,但 APM 是指异步流程管理吗?
-
不,APM 表示异步编程模型 (msdn.microsoft.com/en-us/library/ms228963.aspx)
-
感谢马丁。您的 GetMyRoomUrlAsync() 函数代码有点难以理解。可能所有代码都不存在。何时调用 GetRoomUrlCompleted() 委托?后来你改变了方法,因为在后面的示例中你使用 BeginGetRoomUrl()。
-
第二个示例中没有 GetRoomUrlComleted(),因为它显示了使用 BeginMethod 和 EndMethod 的 APM 模式...如果您的意思是在 web 服务检索到 url 后调用的代码在哪里然后是 iar => { .... }