前回の シンプルなチャットをつくる ランキングを偽装させないゲームをつくる準備 ではテキストの送信をしましたが、今回はキー操作とタイマーイベントの処理をおこないます。

キーを押すと○○が押されましたと表示され、離されると○○が離されましたと文字列が表示され、しばらくすると文字列が消えます。また下の行では1秒ごとにカウントアップされているのがわかります。同じページを複数のタブで開くとそれぞれ別にカウントしていることがわかります。

KeyTimerTest1クラスを作ります。名前空間は前回と同じ SignalRChat.Hubsです。

SendMessageメソッドを削除してDownKeyメソッドとDownUpメソッドを追加しました。

次にページを作ります。

Pages\KeyTimerTest.cshtml

あとはサーバーでタイマーを動作させ、そのときにデータの変更点を通知することができればゲームができそうです。

タイマーを生成して1秒おきにデータを送信しようとして以下のようなコードを書いてみたのですが動きません。

<例外の画像>

実は同じような質問がStack Overflowでもされていました。

c# – SignalR: System.ObjectDisposedException with timer – Stack Overflow

Don’t store state in a property on the hub class. Every hub method call is executed on a new hub instance.

ハブクラスのプロパティに状態を保存しないでください。 すべてのハブメソッド呼び出しは、新しいハブインスタンスで実行されます。

状態を保存するなといわれても…、ところが静的なフィールド変数であればどうでしょうか?

これだとブラウザを閉じたり別のページに移動するとタイマーは止まってくれます。またクライアントサイドでReceiveUpdate関数を呼び出すようにしておくと1秒ごとにカウントアップされているのがわかります。

Pages\KeyTimerTest.cshtml

キーを押すと○○が押されましたと表示され、離されると○○が離されましたと文字列が表示され、しばらくすると文字列が消えます。また下の行では1秒ごとにカウントアップされているのがわかります。同じページを複数のタブで開くとそれぞれ別にカウントしていることがわかります。