1

System.Threading.Timerを使用する既存の .NET クラス ライブラリを、Windows 8.1 を対象とする Windows ストア アプリに移植しています。クラスは利用可能ですが、対応する .NET Framework に関連していくつかのTimerオプションが欠落しているようですTimer

特に、Windows ストア バージョンで使用できるコンストラクターは 2 つだけです。

public Timer(TimerCallback callback, Object state, int dueTime, int period);
public Timer(TimerCallback callback, Object state, TimeSpan dueTime, TimeSpan period);

.NET Framework には、次の追加のコンストラクターが含まれています。

public Timer(TimerCallback callback);

これは、MSDNのドキュメントセットdueTimeとオブジェクト自体によるperiodものです。Timeout.InfinitestateTimer

単一の引数コンストラクターを置き換えようとしてTimer、次のように、Windows 8.1 コンストラクターの 1 つにオブジェクトを渡すことを「素朴に」試みました。

Timer t;
t = new Timer(MyCallback, t, Timeout.Infinite, Timeout.Infinite);  // WILL NOT WORK!!!

もちろん、これはコンパイルエラーのみを引き起こします

割り当てられていないローカル変数 't' の使用

また、クラスにはStateセッターやSetStateメソッドがないため、構築後に を設定することはできません。Timerstate

Timer(TimerCallback)完全なフレームワークのコンストラクターを完全に模倣するにはどうすればよいですか?

4

2 に答える 2

1

これらのオプションは、フィールド/プロパティが設定された後にタイマーを手動で開始する限り、許容されることに注意してください。つまり、現在のTimeout.Infinite時間に使用することを意味します。

状態オブジェクト

プロパティを状態オブジェクトに追加します。

public class MyState
{
   public Timer { get; set; }
}

//create empty state
MyState s = new MyState();
//create timer paused
Timer t = new Timer(MyCallback, s, Timeout.Infinite, Timeout.Infinite);
//update state
s.Timer = t;
//now safe to start timer
t.Change(..)

プライベート フィールド

_t = new Timer(MyCallback, null, Timeout.Infinite, Timeout.Infinite);

MyCallback(object state)
{
  // now have access to the timer _t
  _t.
}

内部クラスのプライベート フィールド

また、複数のプライベート フィールドを起動して追跡するために 1 つのプライベート フィールドでは不十分な場合は、タイマーをラップする新しいクラスを作成します。これは内部クラスである可能性があります:

public class ExistingClass
{
    public void Launch()
    {
        new TimerWrapper(this);
    }

    private sealed class TimerWrapper
    {
        private readonly ExistingClass _outer;
        private readonly Timer _t;

        public TimerWrapper(ExistingClass outer)
        {
            _outer = outer;
            //start timer
            _t = new Timer(state=>_outer.MyCallBack(this),
                           null, Timeout.Infinite, Timeout.Infinite);
        }

        public Timer Timer
        {
            get { return _t; }
        }
    }

    private void MyCallBack(TimerWrapper wrapper)
    {
        wrapper.Timer.
    }
}
于 2013-10-31T12:06:26.157 に答える