2016-09-15 177 views
0

在我的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); 
     }); 
    } 
  1. 为什么我无法连接?当我使StartMyTask不是一项任务时,它可以工作。
  2. 我假设如果我不想等到数据库写入,我会删除Wait() - 是否正确?如果连接发生并且DB之后写入,这会导致任何问题吗?

回答

0

如果当前SynchronizationContext一次只允许一个线程(例如,ASP.NET同步上下文),则会发生这种情况。我在博客上详细解释了deadlock semantics

SignalR不应该泄漏SynchronizationContext.Current - 我的印象是他们固定这个,但显然不是。

无论如何,你可以不堵异步工作解决您的代码:

public override async Task OnConnected() 
{ 
    await StartMyTask(); 
    await base.OnConnected(); 
} 
+0

等待是不行的,因为我调用这个从OnConnected(不异步方法)。 StartMyTask() - 没有等待()关键字的作品,但你预先在OnConnected退出后将任何问题保存到数据库吗? - 我的意思是这个工作...所以如果我已经连接,我的信息稍后保存 – BobSwanson

+0

也是,StartMyTask()与TaskT = StartMyTask()相同? – BobSwanson

+0

@BobSwanson:就像我在回答中所做的那样,使它成为'async',然后'await'就可以工作。 –