没有理由使用Task.Factory.StartNew
.
context.Groups.Add(connectionId, groupName)
已经返回了Task
在向groupName
您期望由connectionId
.
你打电话时
Task.Factory.StartNew(() => context.Groups.Add(connectionId, groupName))
你得到一个Task<Task>
.
这意味着当您调用Groups.Send(groupName, message)
inside of 时ContinueWith
,只有外部 Task 已完成,并且connectionId
尚未完全添加到groupdName
.
如果您运行的是 .NET 4.5,重写此代码的最简单方法是使用 async/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();
}
注意:在我的示例connectionId
中是第一个参数,context.Groups.Add
并且groupName
是第二个参数。这是这些参数的正确顺序,与您在问题中的编写方式相反。
我不知道为什么您以前的代码可以与 C# 客户端一起使用,但不能与 Java 一起使用。鉴于您的问题中提供的代码,我希望任何一个客户端都会错过第一条发送的消息。