1

Thread.Sleepに残っている秒数を何とか返すことは可能ですか?

while ループと Thread.Sleep() を使用して他の方法を試しましたが、適切に動作することはありませんでした。

基本的に、残り時間でリストビューフィールドを更新したい

4

3 に答える 3

3

私はvcsjonesが述べたことに同意しますが。あなたが要求することをするための最良の方法

int millisecondsToSleep=2000;
while (milliseconds>0)
{
    Thread.Sleep(500);
    millisecondsToSleep=millisecondstoSleep-500;
    //alert yourself how much time you have left
    MessageBox.Show(millisecondsToSleep.ToString());
    //do something else if you wish
}

したがって、これは0.5秒間スリープしてから、残り時間のアラートを送信します

タイマーは

            Timer myTimer = new Timer();
            myTimer.Interval = 2000; //2 seconds
            myTimer.Tick += new EventHandler(myTimer_Tick);// fires the myTimer_Tick event every 2 seconds
于 2012-05-10T18:36:04.783 に答える
1

Thread.Sleepスレッドが何かを実行するのを停止します。また、完全に正確ではありません(ただし、実際にどれほど正確かはわかりません)。1つのスレッドをスリープ状態にしてから、残り時間を示すフィールドを表示する場合。最善のアプローチは

1.)スレッドの1つをX秒間スリープします

2.)UIスレッドで、X秒間毎秒起動するタイマーを開始し、計算を実行して、残りの推定時間を表示します。

私が考えることができる他の代替案は、同じスレッドをスリープ状態にして、残り時間を表示することです。しかし、L'Legが提案するようなことをする必要があります。

多分私はあなたの目標が何であるかを誤解しています。しかし、私はあなたがそれらの行動のどちらかを望むような状況を想像することはできません。

別のスレッドで作業が行われていて、残り時間を報告したい場合は、BackgroundWorkerと「ReportProgress」の使用を検討してください。

于 2012-05-10T18:36:44.530 に答える
0

呼び出しThread.Sleepは、コードの匂いがする場合があります。あなたがそれをどのように使用しているかを正確に見なければ、あなたのシナリオでの使用を主張することはできません. しかし、それはさておき、次のクラスがあなたの問題を解決するかもしれません。とはいえ、これを使うシチュエーションは個人的には思いつきません。

public class Sleeper
{
  private TimeSpan remaining = TimeSpan.Zero;

  public TimeSpan GetRemaining()
  {
    lock (this)
    {
      if (remaining > TimeSpan.Zero)
      {
        Monitor.Pulse(this);
        Monitor.Wait(this);
      }
      return remaining;
    }
  }

  public void Sleep(TimeSpan timeout)
  {
    lock (this)
    {
      if (remaining > TimeSpan.Zero)
      {
        throw new InvalidOperationException("Sorry, but I'm not safe for multiple sleepers.");
      }
      remaining = timeout;
      DateTime expires = DateTime.UtcNow.Add(remaining);
      bool complete = remaining <= TimeSpan.Zero;
      while (!complete)
      {
        bool complete = Monitor.Wait(this, remaining);
        remaining = expire - DateTime.UtcNow;
        if (remaining <= TimeSpan.Zero)
        {
          complete = true;
        }
        if (complete)
        {
          remaining = TimeSpan.Zero;
        }
        Monitor.Pulse(this);
      }
    }
  }
}

そして、このように使用します。

public static void Main()
{
  var sleeper = new Sleeper();

  Task.Factory.StartNew(
    () =>
    {
      while (true)
      {
        sleeper.Sleep(TimeSpan.FromMinutes(1);
      }
    });

  while (true)
  {
    Console.WriteLine("Press ENTER to get time remaining...");
    Console.ReadLine();
    TimeSpan remaining = sleeper.GetRemaining();
    Console.WriteLine("Remaining = " + remaining.ToString());
  }
}

繰り返しますが、これが役立つ可能性があると想像できるシナリオはごくわずかです。タイミングに重点を置いた、より洗練されたラッチのバリエーションが役立つ可能性があると思います。それがどのように機能するかの原則は、私が上で作成したものと非常に似ています。これを「時限ラッチ」と呼ぶこともできます。これは、関心のある発信者に期限を報告することもできます。

于 2012-05-10T20:50:24.947 に答える