2016-12-21 7 views
-2

こんにちは、私はc#apiを使用してテレグラムでテキストベースのゲームを作ろうとしています。 私はデータベースを持っています: Player(playerID、username、health、money、missionID、missionDuration)。テレグラムを使用してテキストゲームで時間のあるクエストシステム

MissionIDとmissionDurationはNULLにすることができます。

ミッション(ミッションID、説明)。

プレイヤーがコマンド「/ mission」をボットに送信すると、ランダムミッションがプレイヤーに割り当てられ、ランダムなデュレーション番号が生成されます。

ミッションが終了しているかどうかを確認するにはどうすればよいですか?

私は期間が終わったかどうかを確認するコードのこの作品を作った:もちろん

public static bool Check(double duration) 
    { 
     DateTime now = DateTime.Now; 
     DateTime end = DateTime.Now; 

     end = end.AddSeconds(duration); 

     while (now < end) 
     { 
      now = DateTime.Now; 
     } 

     return true; 
    } 

CPUが常に使用されているので、これは間違っています。 時間が経過したかどうかを確認する方法はありますか?

+0

は、このWindowsフォームです応用?コンソールアプリケーションですか? WPF?あなたが探しているのはタイマーだが、それはあなたが書いているアプリのタイプに依存するように聞こえる。 –

+0

これはコンソールアプリケーションです。 –

答えて

0

通常、このような状況では、一定の時間が経過するとタイマーが作成されます。タイマーが満了すると、コールバックは間隔が終了したことを示すイベントを設定します。これを行う1つの方法は次のとおりです。

using System.Threading; 
static private Timer questTimer; 
static private ManualResetEvent questExpired = new ManualResetEvent(false); 

// in your code where you start the quest 

// clears the event to show that the quest has not ended 
questExpired.Reset(); 

// start the timer. 
questTimer = new Timer(QuestEndedCallback, null, TimeSpan.FromSeconds(duration), TimeSpan.FromMilliseconds(-1)); 

これで、すぐに開始されるタイマーが作成されます。 durationミリ秒後に、タイマーの有効期限が切れ、QuestEndedCallbackメソッドが呼び出されます。 TimeSpan.FromMilliseconds(-1)は、それが「ワンショット」タイマーであることを示します。

QuestEndedCallbackは次のとおりです。

クエストが終了した場合、あなたがイベントをチェック見たいと思ったときに、処理を行い、あなたのコードで
static void QuestEndedCallback(object state) 
{ 
    // Set the timer to indicate that the quest has ended. 
    questExpired.Set(); 
} 

bool questHasEnded = questExpired.WaitOne(0); 
関連する問題