1

Xamarin Forms ベースのプロジェクトで System.Timer を使用したいと考えています。私は実際に Xamarin iOS プロジェクトを Xamarin Formbased プロジェクトに変換しています。私の Xamarin iOS プロジェクトには、System.Timer を使用したタイマーのすべてのコードがあります。

  aTimer = new Timer (tm);

  // Hook up the Elapsed event for the timer.
  aTimer.Elapsed += new ElapsedEventHandler (OnTimedEvent);


  aTimer.Enabled = true;
  aTimer.Start ();

Xamarin Forms プロジェクトで同じコードを使用しようとすると、エラーが発生します。初めに

using System.Timers;

それは言います:タイプまたは名前空間の名前Timersは、名前空間Systemに存在しません。アセンブリ参照がありませんか?

Xamarin iOS System は Xamarin Forms System リファレンスとは異なりますか?

4

2 に答える 2

7

PCL プロジェクトは System.Timer をサポートしていません。

Xamarin Forms にはタイマーが組み込まれており、この制限を回避するのに役立ちます

Device.StartTimer (new TimeSpan (0, 0, 60), () => {
    // do something every 60 seconds
    return true; // runs again, or false to stop
});

ボタンを使用してタイマーを開始および停止する場合は、次のようにすることができます。

bool timerStatus = false;

btnStart.Clicked += delegate {
  timerStatus = true;
  Device.StartTimer (new TimeSpan(h,m,x), () => {
     if (timerStatus) {
       // do work
     }
     return timerStatus;
  });
};

btnStop.Clicked += delegate {
  timerStatus = false;
};
于 2015-05-22T15:07:06.197 に答える
0

Xamarin フォーム ライブラリはポータブル クラス ライブラリであるため、タイマーは、特定のターゲット プラットフォームの組み合わせの API の一部ではありません。

時間の適切な実装の置き換えは、Task.Delay使用可能なタイマーを持つプラットフォームで PCL ライブラリを使用する際の問題を回避するために内部としてマークされた を使用した実装です。このコードをドロップイン シムとして使用できます (出典: 上記のリンク)。

internal delegate void TimerCallback(object state);

internal sealed class Timer : CancellationTokenSource, IDisposable
{
    internal Timer(TimerCallback callback, object state, int dueTime, int period)
    {
        Contract.Assert(period == -1, "This stub implementation only supports dueTime.");
        Task.Delay(dueTime, Token).ContinueWith((t, s) =>
        {
            var tuple = (Tuple<TimerCallback, object>)s;
            tuple.Item1(tuple.Item2);
        }, Tuple.Create(callback, state), CancellationToken.None,
            TaskContinuationOptions.ExecuteSynchronously | TaskContinuationOptions.OnlyOnRanToCompletion,
            TaskScheduler.Default);
    }

    public new void Dispose() { base.Cancel(); }
}
于 2015-05-22T15:29:31.023 に答える