没有理由使用Task.Factory.StartNew
。
context.Groups.Add(connectionId, groupName)
已经返回Task
,你应该将消息发送到您希望通过connectionId
标识的客户端groupName
前等待。
当你调用
Task.Factory.StartNew(() => context.Groups.Add(connectionId, groupName))
你得到一个Task<Task>
。
这意味着当你调用Groups.Send(groupName, message)
的ContinueWith
内,只有外部任务已完成,并connectionId
尚未完全加入groupdName
。
如果您运行的.NET 4.5,重写这段代码最简单的方法是使用像这样的异步/ AWAIT模式:
public async Task AddToGroupAndSend(IPersistentConnectionContext context,
string connectionId,
string groupName,
object message)
{
await context.Groups.Add(connectionId, groupName);
await context.Groups.Send(groupName, message);
}
如果您运行的.NET 4.0,你可以继续使用ContinueWith
,但没有Task.Factory.StartNew
:
public Task AddToGroupAndSend(IPersistentConnectionContext context,
string connectionId,
string groupName,
object message)
{
// This doesn't appropriately handle faulted or canceled tasks
return context.Groups.Add(connectionId, groupName)
.ContinueWith(t => groups.Send(groupName, message));
}
如果你不介意的代码执行同步你甚至可以做到以下几点:
public void AddToGroupAndSend(IPersistentConnectionContext context,
string connectionId,
string groupName,
object message)
{
context.Groups.Add(connectionId, groupName).Wait().
groups.Send(groupName, message).Wait();
}
NOTE:在我的示例中,connectionId
是context.Groups.Add
的第一个参数,groupName
是第二个参数。这是这些参数的正确顺序,与您在问题中编写它的方式相反。
我不知道为什么你以前的代码可以和C#客户端一起工作,但不能和Java一起工作。鉴于您的问题中提供的代码,我希望任何客户端都会错过首次发送的消息。