沒有理由使用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一起工作。鑑於您的問題中提供的代碼,我希望任何客戶端都會錯過首次發送的消息。