SignalR异步任务
问题描述:
在我的SignalR2集线器中,我添加了一个将从客户端调用的异步方法StartMyTask()以及OnConnected()方法。然而,每当OnConnected执行它从来没有连接到集线器(或返回base.OnConnected())从来没有被击中:SignalR异步任务
枢纽:
public override Task OnConnected()
{
StartMyTask().Wait(); // add stuff to db here
return base.OnConnected();
}
static async Task StartMyTask()
{
await Task.Run(() =>
{
Thread.Sleep(10);
});
}
- 为什么我无法连接?当我使StartMyTask不是一项任务时,它可以工作。
- 我假设如果我不想等到数据库写入,我会删除Wait() - 是否正确?如果连接发生并且DB之后写入,这会导致任何问题吗?
答
如果当前SynchronizationContext
一次只允许一个线程(例如,ASP.NET同步上下文),则会发生这种情况。我在博客上详细解释了deadlock semantics。
SignalR不应该泄漏SynchronizationContext.Current
- 我的印象是他们固定这个,但显然不是。
无论如何,你可以不堵异步工作解决您的代码:
public override async Task OnConnected()
{
await StartMyTask();
await base.OnConnected();
}
等待是不行的,因为我调用这个从OnConnected(不异步方法)。 StartMyTask() - 没有等待()关键字的作品,但你预先在OnConnected退出后将任何问题保存到数据库吗? - 我的意思是这个工作...所以如果我已经连接,我的信息稍后保存 – BobSwanson
也是,StartMyTask()与TaskT = StartMyTask()相同? – BobSwanson
@BobSwanson:就像我在回答中所做的那样,使它成为'async',然后'await'就可以工作。 –