2

我正在使用 SignalR 1.1.2,但异步集线器方法有问题。使用 ForeverFrame 传输在我的 PC 上一切正常,但在服务器上部署并切换到 Web 套接字传输后,我收到以下错误:

此时无法启动异步操作。异步操作只能在异步处理程序或模块内或在页面生命周期中的某些事件期间启动。如果在执行页面时发生此异常,请确保将页面标记为 <%@ Page Async="true" %>。

我的集线器方法代码:

public async Task<string> getUrl()
    {
        var url = await MyWebservice.GetMyRoomUrlAsync(Context.User.Identity.Name);

        return url;
    }

SignalR 中是否支持带有 web 套接字传输的异步方法?

更新: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;
    }
4

1 回答 1

5

async方法受支持。但是,您不能使用async voidasync包装EAP 方法

造成这种情况的一个常见原因是使用WebClient而不是较新的HttpClient. 如果这里不是这种情况,您需要发布GetMyRoomUrlAsync.

于 2013-07-01T12:06:17.973 回答