Функция изменения таймера PCL

Я проверил Таймер в Portable Library, но понятия не имел, как вызвать функцию Change. , потому что он не был реализован в классе и не унаследован от родителя.

_timer = new Timer(OnTimerTick, null, TimeSpan.FromSeconds(1.0), TimeSpan.Zero);
_timer.Change(TimeSpan.FromSeconds(1.0), TimeSpan.Zero); //how to implement this

person Chris Lui    schedule 08.04.2015    source источник
comment
это для проекта Xamarin.Forms?   -  person Jason    schedule 08.04.2015
comment
У него нет функции изменения. Просто утилизируйте его и создайте новый.   -  person Artur Shamsutdinov    schedule 08.04.2015
comment
@Jason, просто обычный проект xamarin PCL с использованием mvvmcross   -  person Chris Lui    schedule 08.04.2015
comment
@ArturShamsutdinov, но, согласно руководству Стюарта Лоджа, он должен быть один, и я проверил класс System.Threading.Timer в msdn, он предоставил 3 перегруженных функции Change().   -  person Chris Lui    schedule 08.04.2015
comment
На какой профиль PCL вы ориентируетесь?   -  person Anders Gustafsson    schedule 08.04.2015
comment
@AndersGustafsson Я использую Profile78.   -  person Chris Lui    schedule 09.04.2015


Ответы (2)


Вместо использования 1-го решения: (создание класса Timer) Дэвида Кина, теперь я использую его 3-е решение: (создание целевого адаптера .NET 4.0 Timer) с образцом кода Генри К.

В любом случае, я все еще надеюсь получить отзывы о том, как реализовать функцию Change в классе Timer, как это определено в .NET. Спасибо!

public class PCLTimer
{
    private System.Threading.Timer timer;
    private Action<object> action;

    public PCLTimer(Action<object> action, object state, int dueTimeMilliseconds, int periodMilliseconds)
    {
        this.action = action;
        timer = new System.Threading.Timer(PCLTimerCallback, state, dueTimeMilliseconds, periodMilliseconds);
    }

    public PCLTimer(Action<object> action, object state, TimeSpan dueTimeMilliseconds, TimeSpan periodMilliseconds)
    {
        this.action = action;
        timer = new System.Threading.Timer(PCLTimerCallback, state, dueTimeMilliseconds, periodMilliseconds);
    }

    private void PCLTimerCallback(object state)
    {
        action.Invoke(state);
    }

    public bool Change(int dueTimeMilliseconds, int periodMilliseconds)
    {
        return timer.Change(dueTimeMilliseconds, periodMilliseconds);
    }

    public bool Change(TimeSpan dueTimeMilliseconds, TimeSpan periodMilliseconds)
    {
        return timer.Change(dueTimeMilliseconds, periodMilliseconds);
    }

    public new void Dispose()
    {
        timer.Dispose();
    }
}
person Chris Lui    schedule 09.04.2015

Я разработал библиотеку поддержки, содержащую типы, отсутствующие или неполные в PCL. Библиотека называется Shim и также доступна на NuGet.

Shim используется в разных экземплярах для разных целевых платформ. Если вы установите Shim из NuGet, он выберет соответствующий экземпляр для вашего проекта Visual Studio, будь то переносимая библиотека классов, приложение Windows 8 или класс Xamarin.Android. библиотека.

Shim содержит объявление System.Threading.Timer, включая два конструктора и метод Change(int, int). При использовании Shim из приложения или библиотеки классов Windows 8 существует специфичная для Windows 8 реализация с внутренним использованием класса Windows.System.Threading.ThreadPoolTimer. Для других (не PCL) целей платформы объявление [TypeForwardedTo] используется для переадресации вызовов к существующей реализации для этой конкретной цели.

Некоторые общие сведения о реализации можно найти в этом ответе SO. Если вам не нужны накладные расходы на полный пакет Shim, вы можете использовать подход, представленный в этом ответе SO, для самостоятельной реализации необходимых частей.

person Anders Gustafsson    schedule 20.04.2015