を使用する理由はありません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)
の内部で呼び出すと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
は 2 番目の引数です。これは、これらのパラメーターの正しい順序であり、質問に書いた方法とは逆です。
以前のコードが C# クライアントでは機能するのに、Java では機能しない理由がわかりません。あなたの質問で提供されたコードを考えると、どちらのクライアントも最初に送信されたメッセージを見逃すと思います。