0

在我的 SignalR2 集线器中,我添加了将从客户端调用的异步方法 StartMyTask() 以及 OnConnected() 方法。但是,每当 OnConnected 执行时,它永远不会连接到集线器(或返回 base.OnConnected())永远不会被击中:

中心:

    public override Task OnConnected()
    {
        StartMyTask().Wait(); // add stuff to db here
        return base.OnConnected();
    }

    static async Task StartMyTask()
    {
        await Task.Run(() =>
        {
             Thread.Sleep(10);
        });
    }
  1. 为什么我无法连接?当我让 StartMyTask 不是一项任务时,它就可以工作。
  2. 我假设如果我不想等到数据库写入,我会删除 Wait() - 对吗?如果连接发生并且数据库在之后写入,这会导致任何问题吗?
4

1 回答 1

0

如果有一个电流SynchronizationContext一次只允许一个线程进入(例如,一个 ASP.NET 同步上下文),就会发生这种情况。我在我的博客上完整地解释了死锁语义

SignalR 不应该泄漏SynchronizationContext.Current- 我的印象是他们解决了这个问题,但显然不是。

无论如何,您可以通过不阻塞异步工作来修复您的代码:

public override async Task OnConnected()
{
  await StartMyTask();
  await base.OnConnected();
}
于 2016-09-15T20:14:10.983 回答